整型溢出
数学上一个数的平方当然大于等于 0,但对于大多数编程语言,当 46341 <= int x <= 65535 时,x 的平方结果会是负数。
1. 基础知识
- bit 位: 0和1
- byte 字节:1个字节有8个比特位
2. 补码
1 | 0b0000 = 0 |
如果要表示负数,那么就采用补码方式,把二进制的最高位作为符号位,即最高位系数需要加一个符号。
1 | 0b1000 = -1 * 8 = -8 |
所以int可以表示 [-2^32, 2^32-1] 的整数,同时 -Integer.MIN_VALUE 还是等于 Integer.MIN_VALUE,即最小负数的绝对值还是自己,所以负数的相反数不一定是正数。同时最大整数+1会导致符号位进位变为1,结果是一个负数。
3. 乘法
1 | 0b0011 × 0b0011 |
3 * 3 = 3 * ( 4 - 1) 左移2位,补零,再减1,看着没问题,但是当牵涉到补码的时候,就会发现结果变成了 -7