1 #include <stdio.h> 2 int main() 3 { 4 unsigned char a = 128; 5 char b = a; 6 printf("a = %d , b = %d",a,b); 7 return 0; 8 }
输出结果为 a = 128 , b = -128。
128的二进制表示为1000 0000
因为char是有符号类型,所以编译器把128,即1000 0000当成有符号数,即补码为1000 0000 (因为计算机中的有符号数都是用补码来表示的),其表示的十进制值为B2T = -2^8 = -128(此处参考csapp中第45面的公式2.3)。所以b = 128
本文探讨了C语言中从无符号char到有符号char的数据类型转换原理,解释了128在不同类型的表示下如何变为-128,并通过二进制和补码的概念详细解析。
674

被折叠的 条评论
为什么被折叠?



