【C语言】告诉你为什么unsigned char a=-1;%d打印出来是255

一、自动类型转换流程

 要注意的是: 在进行自动类型转换时,原数据的类型没有改变,而是得到一个转化后的中间变量

并不是char转化成int又转化成long······

进入正题

来看一段代码,猜一猜打印的结果是什么


   
   
    
    
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char a = -1;
  5. signed char b = -1;
  6. unsigned char c = -1;
  7. printf( "a=%d,b=%d,c=%d", a, b, c);
  8. return 0;
  9. }

结果是:a=-1,b=-1,c=255

可以认为,在当前编译器下,char 等价于signed char

我们知道C语言中为一个字符分配一个字节(8位),一个int整型分配4个字节(32位)

整形数据用整数的补码形式存放


- 1

原码:1000 0000 0000 0000 0000 0000 0000 0001

反码:1111 1111 1111 1111 1111 1111 1111 1110

补码:1111 1111 1111 1111 1111 1111 1111 1111


-1赋给char型变量 a, 从后边截断8位

a

补码:1111 1111

当用%d打印时,进行自动类型转化,认为a的最高位是符号位,最高位为1,从左补1,直至32位

打印a的中间变量补码为:

        1111 1111 1111 1111 1111 1111 1111 1111

        1000 0000 0000 0000 0000 0000 0000 0000

原码:1000 0000 0000 0000 0000 0000 0000 0001

所以a打印的是-1,b同理


c是unsigned char 类型,当用%d打印时,进行自动类型转化,编译器认为c的最高位不是符号位,从左补0,直至32位

因此打印c的中间变量补码为:

0000 0000 0000 0000 0000 0000 1111 1111

转化为十进制为255

所以c打印出来的的是255

总结一下,在变量前面的类型不会对变量在计算机中的存储有任何影响,比如char c = -1与unsigned char c = -1这两种方式,不管是char 还是 unsigned char 类型,-1按道理是四个字节以补码的方式存储,但由于是一个字节,所以将最后一个字节保留了下来,char 与 unsigned char 只是对编译器有所影响,影响编译器如何对这串0与1的解释,在比大小的时候会有影响,unsigned char最高位也是数值,而char最高位是符号,在unsigned char c = -1 与3比大小的时候,先是转换为同一类型,都是int,c就要扩展成int型的,然后在比大小

一、自动类型转换流程

 要注意的是: 在进行自动类型转换时,原数据的类型没有改变,而是得到一个转化后的中间变量

并不是char转化成int又转化成long······

进入正题

来看一段代码,猜一猜打印的结果是什么


   
   
  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char a = -1;
  5. signed char b = -1;
  6. unsigned char c = -1;
  7. printf( "a=%d,b=%d,c=%d", a, b, c);
  8. return 0;
  9. }

结果是:a=-1,b=-1,c=255

可以认为,在当前编译器下,char 等价于signed char

我们知道C语言中为一个字符分配一个字节(8位),一个int整型分配4个字节(32位)

整形数据用整数的补码形式存放


- 1

原码:1000 0000 0000 0000 0000 0000 0000 0001

反码:1111 1111 1111 1111 1111 1111 1111 1110

补码:1111 1111 1111 1111 1111 1111 1111 1111


-1赋给char型变量 a, 从后边截断8位

a

补码:1111 1111

当用%d打印时,进行自动类型转化,认为a的最高位是符号位,最高位为1,从左补1,直至32位

打印a的中间变量补码为:

        1111 1111 1111 1111 1111 1111 1111 1111

        1000 0000 0000 0000 0000 0000 0000 0000

原码:1000 0000 0000 0000 0000 0000 0000 0001

所以a打印的是-1,b同理


c是unsigned char 类型,当用%d打印时,进行自动类型转化,编译器认为c的最高位不是符号位,从左补0,直至32位

因此打印c的中间变量补码为:

0000 0000 0000 0000 0000 0000 1111 1111

转化为十进制为255

所以c打印出来的的是255

总结一下,在变量前面的类型不会对变量在计算机中的存储有任何影响,比如char c = -1与unsigned char c = -1这两种方式,不管是char 还是 unsigned char 类型,-1按道理是四个字节以补码的方式存储,但由于是一个字节,所以将最后一个字节保留了下来,char 与 unsigned char 只是对编译器有所影响,影响编译器如何对这串0与1的解释,在比大小的时候会有影响,unsigned char最高位也是数值,而char最高位是符号,在unsigned char c = -1 与3比大小的时候,先是转换为同一类型,都是int,c就要扩展成int型的,然后在比大小

猜你喜欢

转载自blog.csdn.net/m0_53573725/article/details/132504545