整数
1 有符号数 正数:原码、反码、补码 相同
负数:原码、反码、补码不同,要进行计算
2 无符号数 原码、反码、补码相同
整型提升(打印整数就要整型提升)
1有符号按照高位的符号位进行补充至完整 -----是补码
2还要返回去算原码
无符号数 进行高位补0 原反补相同
对于整形来说:数据存放内存中其实存放的是补码。为什么呢?
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理:同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换﹐其运算过程是相同的,不需要额外的硬件电路。
存储的补码,但是输出的是原码
例1:
char a=-1
原码 100000000 000000000 00000000 00000001
反码 11111111 11111111 11111111 111111110
补码 11111111 11111111 11111111 111111111
因为是char类型(占用一个字节)所以为 11111111
又因为输出是%d所以要整型提升为 :
11111111 11111111 11111111 111111111 (补码)
则返回的原码为:(符号位不变 减一 -----取反)
10000000 00000000 00000000 00000001 (原码)
所以a=-1;
signed b=-1 和上面相同 -----有符号按照高位的符号位进行补充至完整 -----是补码
unsigned c=-1
前面原反补相同
因为是char类型(占用一个字节)所以为 11111111
无符号数 进行高位补0 原反补相同
所以为:00000000 00000000 00000000 11111111
c=255;
例2:
原码 10000000 00000000 00000000 10000000
反码 111111111 11111111 11111111 011111111
补码 11111111 11111111 11111111 10000000
因为是char 所以是 10000000
又因为输出是%u 无符号原反补相同
整型提升 11111111 11111111 11111111 100000000 (补码)
所以为(2^32)-128=a=4294967168
例子3:
原码 00000000 00000000 00000000 100000000
正数 原码=反码=补码
因为是char 所以是 10000000
又因为输出是%u 无符号原反补相同
00000000 00000000 00000000 100000000 = 127+1
所以a=-128