跳转至

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

img

博客:Luuuuyang

对 +0、-0 的理解

以 8 位计算机存储为例

img

img

总结

见一个学一个

参考

https://blog.csdn.net/HPU_LY/article/details/83995407

【计算机组成原理】对原码与补码的理解_Luuuuyang的博客-CSDN博客

https://zh.wikipedia.org/zh-han