题目代码如下:
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
解题关键:
1.二进制存储:原码,反码,补码 互换
2.截断
3.整型提升
1.二进制存储,截断:
-1 是个整型,存储形式应该是:
原码:1000000…00000001
反码:11111111…11111110
补码:11111111…11111111
而char类型占 1 个字节,8个 bit位,从低位发生截断:
11111111
2.整型提升,补码转原码:
注意:发生整型提升时才与变量类型有关(有无符号…)
%d 是打印十进制整型的,整型占 4 个字节
而 char 在vs中默认有符号整型,也就是 signed char
发生整型提升时:
有符号的向高位加符号位
无符号的向高位补 0
此时 前两个补码:111111…111111111
第三个补码: 00000000…11111111
这是补码,写出它原码代表的数字就是要输出的值
前两个原码:10000000…00000001
第三个原码(原反补相同):00000000…11111111
所以前两个输出的都是 -1 ,第三个输出的是 255