文章目录
- 不同处
- 溢出
- 最大值
- 最小值
- 溢出后值变成什么
不同处
unsigned int a = -1; int b = -1; printf("%d %d \n", a, b); // -1 -1 printf("%u %u", a, b); // 4294967295 4294967295
\u是无符号输出 可以理解为都是正数输出
正常int 一个 -1 是以补码的形式存储 4字节int 就是 11111111 11111111 11111111 11111111
在读取的时候 首位是1表示是负数 然后取反码 最后位 +1 就成了 10000000 00000000 00000000 00000001
读取有符号整数值就是-1
无符号读取的话就忽略查看首位是1还是0都按照正常二进制计算,就成了二进制能表示的int类型最大数:4294967295unsigned 类型和 signed能表示的最大数也有差异 比如 无符号能表示100个数 从0 ~ 100 有符号只能是 -50 ~ 50要兼顾负数的一面
a,b 输出结果相同是因为 按照\d输出会隐式转换成有符号整形输出即转换成int类型输出,按照 \u输出会转换成无符号整型输出
溢出
最大值
signed int
: printf("%d\n", ~(unsigned int)0 / 2);
//2147483647
unsigned int
: printf("%u\n", ~(unsigned int)0);
//4294967295
当无符号0以二进制存储在内存中时,每一位都为0,以32位int为例,0(unsigned int)的二进制为:
00000000 00000000 00000000 00000000
按位取反(~)后变成:
11111111 11111111 11111111 11111111
此时的十进制为:
4294967295
除以2(int类型中有一半表示负数,且比正数多一个),得到:
2147483647
即为32位int型最大值
最小值
signed int 包含正数和负数 负数比正数多一个
最大 2147483647
最小 -(2147483647 + 1) = -2147483648
unsigned int 无符号都是正数 最小就是0
最大4294967295
溢出后值变成什么
signed 溢出
printf("%d\n", ~(unsigned int)0 / 2); // 2147483647
printf("%d\n", (~(unsigned int)0 / 2) + 1); // -2147483648
如上 溢出后变成了最小值
unsigned
printf("%u\n", ~(unsigned int)0); // 4294967295
printf("%u\n", (~(unsigned int)0) + 1); // 0
溢出后同样变成了最小值
虽然不知道为什么会这样