一
int 类型占用 4 个字节,最小的那个数是 -2147483648,它的补码是 10000000 00000000 00000000 00000000
,反码是 11111111 11111111 11111111 11111111
,原码是 10000000 00000000 00000000 00000000
,也就是原码和补码是一样的。
如果忽略符号位,那么 -2147483648 和 0 的二进制位是一样的。事实上 int 类型的二进制码从 32 个 0 到 32 个 1,分别对应的数是 0,1,2,……,2147483646,2147483647(对应 0 后面 31 个 1),-2147483648(对应 1 后面 31 个 0),-2147483647,……,-3,-2,-1(对应 32 个 1);也就是说如果符号位不同其他位都相同叫做“对应”的话:0 和 -2147483648 对应,1 和 -2147483647 对应,……,2147483647 和 -1 对应。
二
尝试打印 int 类型的正整数中的前 256 个数和后 256 个数,可能会想到如下代码:
1 |
|
事实上第一个循环是没有问题的,但是第二个循环,当打印完最大一个数即 2147483637 后,循环没有停止,而是继续从负的最小一个数开始继续往上打印;原因是 0b01111111111111111111111111111111
之后的这个 j++ 自增运算得到的结果是小于 j 的,即直接跳到 -2147483638 去了;也就是 “2147483637 + 1 = -2147483638”。