请问为什么unsigned与普通char输出时是不一样的呢

c语言小问题,请问为什么unsigned与普通char输出时是不一样的呢

img

char的二进制最高位是符号位,当它转成int类型时,系统会自动将最高位做符号位扩展,而恰好你的用例的前两个字节二进制最高位都是1,你可以把char[1] 改成0x7F试下,就会发现,这两个类型在这种case下是一样的

一个有符号数,一个是无符号数,有符号数是-128127的范围,无符号数是0255的范围。如果一个数是0127的范围,两者是一样的,如果是128255两者就不一样了,一个是正数,一个是负数。不知道能理解不?

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7581122
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言中 unsigned char 与 signed char 不同输出格式一些认识
  • 除此之外, 这篇博客: C语言(关于unsigned char的几个问题)中的 关于unsigned char 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  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的值。

      希望这些回答能够帮到您。