另一种思考方式是,在 32 位有符号整数中,最左边的数字代表两个数字之一:
0000000000000000000000000000000 represents 0
1000000000000000000000000000000 represents -2147483648
根据定义。其他所有内容都是对此的补充(添加),因此:
BINARY REPRESENTATION INT REPRESENTATION
1000000000000000000000000000000 plus -2147483648 plus
0111111111111111111111111111110 equals 2147483646 equals
1111111111111111111111111111110 -2
将最左边(前导)位视为定义您从哪里开始计数会有所帮助:
- 如果最左边位为0,则从0开始计数
- 如果最左边位为 1,则从 -2147483648 开始计数
它右侧的剩余 31 位通过组成一个添加到起点的数字(111 1111 1111 1111 1111 1111 1111 最多 2147483647)来定义整数值本身。
然后,有符号整数有效地环绕。他们数到最大值约为 20 亿,然后立即翻转到 -20 亿并再次计数到 0:
0111111111111111111111111111111 是 2147483647。如果你添加一个,你会得到:
1000000000000000000000000000000 要么是 2147483648 作为无符号整数,要么是 -2147483648,根据定义就是这种方式。当您继续添加到任何整数时,它会接近:
1111111111111111111111111111111 是 -1 作为有符号整数,或 4294967295 作为无符号整数
最终,您应该欣赏并理解,如果您不断添加有符号整数,它们会环绕,但它们会立即从最大正值跳到中间的最小负值:
0, 1, ... 2147483646, 2147483647, -2147483648, -2147483647, ... -2, -1
这就是为什么您的 '1111111111111111111111111111110' 为 -2 的原因,因为它比最大二进制表示(在有符号整数空间中表示 -1)小一