山不在高,有仙则名。水不在深,有龙则灵。
----CSDN 时时三省
例题1:
输出什么?
输出结果为-1 -1 255
为什么结果是这样呢
-1的原码
10000000000000000000000000000001
反码
11111111111111111111111111111110
补码
11111111111111111111111111111111
但是如果放在a里面 a是一个字节
所以存的就是11111111
signed char b
signed表示有符号的char
所以这个b存的就是11111111
unsigned char c
unsigned表示无符号的c
也是存的11111111
上面的a和b都认为它是有符号的所以他的第一个1就是符号位 但是c表示的就是全是有效数字没有符号位
补码以%d打印的时候要看它的原码 所以a=-1
b跟a一样的
无符号位的整形提升高位补0 整形提升以后这就是它的补码
00000000000000000000000011111111
它是正数,所以它的原反补相同
所以它的结果就是255
补充:
1.char到底是signed char还是unsigned char
C语言标准并没有规定,取决于编译器
2.int是signed int 这个是有规定的
3.short是 signed short 这个也是有规定的
例题2:
%u是打印一个无符号数
-128的原码是
10000000000000000000000010000000
反码
11111111111111111111111101111111
补码
11111111111111111111111110000000
char a存的就是10000000
整形提升后就是
11111111111111111111111110000000
如果以%u的形式打印 就是没有符号位了
那它的补码就是它的原码
它的结果打印出来就是
4294967168
例题3:
跟上面打印的结果是一样的
128的原码
00000000000000000000000010000000 原反补相同
a里面放的是10000000
整形提升后
11111111111111111111111110000000
%u打印无符号数 所以上面的数字都是有效数字
结果就是4294967168
注意:
有符号的char的取值范围是:-128~127之间
例题4:
-20的原码
10000000000000000000000000010100
反码
11111111111111111111111111101011
补码
11111111111111111111111111101100
10的原码
00000000000000000000000000001010
它俩的补码相加就是
11111111111111111111111111110110-补码
%d打印的是原码结果
把它变成原码就是
10000000000000000000000000001010
结果就是-10