c语言小问题,请问为什么unsigned与普通char输出时是不一样的呢
char的二进制最高位是符号位,当它转成int类型时,系统会自动将最高位做符号位扩展,而恰好你的用例的前两个字节二进制最高位都是1,你可以把char[1] 改成0x7F试下,就会发现,这两个类型在这种case下是一样的
一个有符号数,一个是无符号数,有符号数是-128127的范围,无符号数是0255的范围。如果一个数是0127的范围,两者是一样的,如果是128255两者就不一样了,一个是正数,一个是负数。不知道能理解不?
unsigned char是char 的无符号类型,同char一样占用1个字节,存储范围为0~255,所存储的数据服从以下规律:
数据服从于一个闭环,当我们输入0~255之间的数据之时,以0为起点,顺时针走向,与存储数据相对应,而当我们输入-1、-3、-9……的时候就会开始,以255为起点,逆时针走向,逐渐递减,分别存储255、253、247……逆时针满足绝对值相加为256原则:
- 以下回答由chatgpt基于相关博客总结生成:
在C语言中,unsigned char和普通char的输出结果不同,是因为它们的类型不同,导致了对应的存储方式和取值范围也不同。
普通的char类型是有符号的,占用1个字节,它的取值范围是从-128到127。其中,-128的补码为1000 0000,而127的补码为0111 1111。 在输出char类型变量时,printf函数会根据其类型解析变量的存储方式。如果变量的值在0到127之间,按照ASCII码表将其转换为对应的字符输出;如果变量的值在-128到-1之间,会根据补码的形式输出。
unsigned char类型是无符号的,同样占用1个字节,它的取值范围是从0到255。在输出unsigned char类型变量时,printf函数会将其值按照ASCII码表转换为对应的字符输出。
下面是一个示例程序演示了输出unsigned char和普通char的差异:
#include <stdio.h> int main() { unsigned char uc = 200; char c = -56; printf("输出unsigned char类型的值: %c\n", uc); printf("输出char类型的值: %c\n", c); return 0; }
运行以上程序,输出结果如下:
输出unsigned char类型的值: È 输出char类型的值: ¨
从输出结果可以看出,unsigned char类型的输出结果是按照ASCII码表将其对应的字符输出的,而char类型的输出结果是根据其补码的形式输出的。
对于问题中给出的具体函数changeChar(),根据要求输入一个char类型的值ch,然后经过一系列的位变换,输出一个newChar,可以按照以下方式实现:
#include <stdio.h> #include <math.h> char changeChar(void) { char ch = 0; char newChar = 0; char temp[7]; // 临时变量 printf("请输入ch:"); scanf("%hhd", &ch); // 将ch的每一位分离到str数组中 int str[7]; for (int j = 0; j <= 6; j++) { str[j] = (ch >> j) & 1; // 移位操作符 } int newStr[7]; // 对原有的每一位进行按要求的具体操作 newStr[0] = str[1]; newStr[1] = str[0]; newStr[2] = str[3]; newStr[3] = str[4]; newStr[4] = str[5]; newStr[5] = str[2]; newStr[6] = str[6]; newStr[7] = str[7]; // 将新的位变换后的转变成char for (int k = 0; k <= 6; k++) { newChar += newStr[k] * pow(2, k); } printf("newChar:%d\n", newChar); return newChar; }
这个函数首先接收用户输入的ch,然后将ch的每一位存储到str数组中。接下来,对str数组进行一系列的位变换操作,得到新的位变换后的结果newStr。最后,将newStr转换成char类型的newChar,输出newChar的值。
希望这些回答能够帮到您。