关于用整型输出字符型数据的问题

来源:百度知道 编辑:UC知道 时间:2024/07/02 21:34:29
今天写了一个实验程序,但是出现的结果不是很明白,请高手指教:
char c=128;
printf("c = %u\n",c); 按%u输出,结果为 4294967168
printf("c = %d\n",c); 按%d输出,结果为 -128

这两种方式不就是有无符号的区别吗?为什么结果会有这么大的差异。感觉上按%u输出,输出的是四个字节的数据,而按%d输出只输出了一个字节的数据。
请高手赐教

128的二进制编码是10000000,当你写char c=128时,系统开出一个字节的内存,把上述编码写进去。
当用%u输出时,需要把一个字节的数扩成四个字节的数,系统默认按照原编码的第一个数字将剩下的位数补齐,即全是1,也就是二进制编码
11111111 11111111 11111111 1000000,这样输出来就是4294967168。
当用%d输出时,也需要把一个字节的数扩成四个字节的数,系统默认把剩下的位数补0,但最高位补1,因为系统认为原来的数10000000是负数。也就是二进制编码10000000 0000000 0000000 1000000
如果你将char 改为 unsigned char,输出结果就是128了。这就是数据之间相互赋值的规则,有点复杂。

将128赋值给有符号的字符型变量C时已经溢出了,用无符号的整形输出实际上是输出了四个字节,不同的编译器对变量类型的大小有不同定义