一.int型
1.signed型
数据在内存中以二进制存储,当位于32位机器中
00000000000000000000000000000000
10000000000000000000000000000000
1111111111111111111111111111111111111
首位是符号位:1代表负数,0代表正数
举一个例子:
signed int i = -1
printf("%d",i)
原码为100000000000000000000000001
反码为1111111111111111111111111111110(按位取反)
补码为1111111111111111111111111111111(反码加一)
要打印%d,因为需要考虑符号,第一位为符号位,剩下以二进制得出答案
2.unsigned型
-1
原码为100000000000000000000000001
补码为1111111111111111111111111111111
不需要考虑符号,直接使用二进制计算
3.总结
在int类型的数据下,有符号型数据范围为-2的31次方~2的31次方
无符号型为0~2的32次方
二.char型(整形提升)
数据依然以二进制储存
1.signed unsigned
依然是-1
原码为10000000000000000000000000000001
补码为11111111111111111111111111111111
又知是char类型占一个字节,取八位11111111(截断)
这时候判断类型为unsigned还是signed判断整型提升是0或者1
在前面加上24位数字,这时为补码,反推出原码之后以%d形式打印(注意符号位)
结果signed为-1
unsigned为255
2.signed且unsinged打印
如果为signed且printf中为%u即要求以无符号整形打印时
直接二进制即可不需要考虑符号位
signed char i = -1
printf("%u",i)