【时时三省】(C语言基础)数据的存储2

山不在高,有仙则名。水不在深,有龙则灵。

                        ----CSDN 时时三省

例题1:

输出什么?

【时时三省】(C语言基础)数据的存储2_第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:

【时时三省】(C语言基础)数据的存储2_第2张图片

 %u是打印一个无符号数

-128的原码是

10000000000000000000000010000000

反码

11111111111111111111111101111111

补码

11111111111111111111111110000000

char a存的就是10000000

整形提升后就是

11111111111111111111111110000000

如果以%u的形式打印 就是没有符号位了

那它的补码就是它的原码

它的结果打印出来就是

4294967168

例题3:

【时时三省】(C语言基础)数据的存储2_第3张图片

 跟上面打印的结果是一样的

128的原码

00000000000000000000000010000000 原反补相同

a里面放的是10000000

整形提升后

11111111111111111111111110000000

%u打印无符号数 所以上面的数字都是有效数字

结果就是4294967168

注意:

有符号的char的取值范围是:-128~127之间

例题4:

【时时三省】(C语言基础)数据的存储2_第4张图片

 -20的原码

10000000000000000000000000010100

反码

11111111111111111111111111101011

补码

11111111111111111111111111101100

10的原码

00000000000000000000000000001010

它俩的补码相加就是

11111111111111111111111111110110-补码

%d打印的是原码结果

把它变成原码就是

10000000000000000000000000001010

结果就是-10

你可能感兴趣的:(【理论+经验】c语言入门,c语言基础知识点,c语言)