整型溢出

整型溢出

参考网址

数学上一个数的平方当然大于等于 0,但对于大多数编程语言,当 46341 <= int x <= 65535 时,x 的平方结果会是负数。

1. 基础知识

  • bit 位: 0和1
  • byte 字节:1个字节有8个比特位

2. 补码

1
2
0b0000 = 0
0b1111 = 15

如果要表示负数,那么就采用补码方式,把二进制的最高位作为符号位,即最高位系数需要加一个符号。

1
2
3
0b1000 = -1 * 8 = -8
0b1011 = -1 * 8 + 2 + 1 = -5
0b1111 = -1 * 8 + 4 + 2 + 1 = -1

所以int可以表示 [-2^32, 2^32-1] 的整数,同时 -Integer.MIN_VALUE 还是等于 Integer.MIN_VALUE,即最小负数的绝对值还是自己,所以负数的相反数不一定是正数。同时最大整数+1会导致符号位进位变为1,结果是一个负数。

3. 乘法

1
2
3
4
    0b0011 × 0b0011
= 0b0011 × (0b0100 - 1)
= 0b1100 - 0b0011
= 0b1001

3 * 3 = 3 * ( 4 - 1) 左移2位,补零,再减1,看着没问题,但是当牵涉到补码的时候,就会发现结果变成了 -7