int 类型取值范围为什么是\(-2^{31}\) 到 \(2^{31}-1\)¶
前置知识¶
二进制,负数的补码
目标¶
int 类型的取值范围,对 +0、-0 的理解
What¶
正数在计算机中表示为原码,最高位为符号位:
1的原码为0000 0000 0000 0000 0000 0000 0000 0001
2147483647的原码为0111 1111 1111 1111 1111 1111 1111 1111
所以最大的正整数是2147483647
负数在计算机中表示为补码,最高位为符号位:
-1的原码为1000 0000 0000 0000 0000 0000 0000 0001,
反码为1111 1111 1111 1111 1111 1111 1111 1110,
补码为1111 1111 1111 1111 1111 1111 1111 1111
-2147483647:
原码为1111 1111 1111 1111 1111 1111 1111 1111,
反码为1000 0000 0000 0000 0000 0000 0000 0000,
补码为1000 0000 0000 0000 0000 0000 0000 0001
所以最小的负数是-2147483647吗?错,不是。
在二进制中,0有两种表方法。
+0的原码为0000 0000 0000 0000 0000 0000 0000 0000,
-0的原码为1000 0000 0000 0000 0000 0000 0000 0000,
因为0只需要一个,所以把-0拿来当做一个最小的数-2147483648。
-2147483648的补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。
注意,这个补码并不是真正的补码,真正的补码是1 1000 0000 0000 0000 0000 0000 0000 0000,溢出。
所以带符号32位int类型整数为-2147483648~2147483647
原码 反码 补码
正数 本身 本身 本身
负数 符号位1,绝对值的原码 符号位1,取反 符号位1,取反+1
我们将数在机器中的这些编码表示称为机器数
一般书写的数,称为机器数的真值
真值 0 的原码和反码表示不唯一,补码表示唯一
[+0]原=000...0 [-0]原=100...0
[+0]反=000...0 [-0]反=111...1
[+0]补=000.000 [-0]补=000...0
博客:Luuuuyang
对 +0、-0 的理解¶
以 8 位计算机存储为例
总结¶
见一个学一个
参考¶
https://blog.csdn.net/HPU_LY/article/details/83995407