为什么最大整数乘法结果为1

Pra*_*mar 1 java int

我认为不需要多解释,为什么以下计算结果为1?

int a = 2147483647;
int b = 2147483647;

int c = a * b;
long d = a * b;
double e = a * b;

System.out.println(c);  //1
System.out.println(d);  //1
System.out.println(e);  //1.0
Run Code Online (Sandbox Code Playgroud)

See*_*ose 11

整数2147483647的二进制表示如下:

01111111 11111111 11111111 11111111
Run Code Online (Sandbox Code Playgroud)

将其与自身相乘得到数字4611686014132420609,其二进制表示形式为:

00111111 11111111 11111111 11111111 00000000 00000000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)

这对于int只有32位的类型来说太大了.的乘法a * b为整数乘法做变量的类型而已,无论哪个结果被分配(这可能会做一个扩大转换,但只有倍后).

因此,结果只是切断了不适合32位的所有位,只留下以下结果:

00000000 00000000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)

这只是价值1.

如果要保留信息,则必须使用long64位的类型进行乘法运算:

long a = 2147483647;
long b = 2147483647;
long mult = a * b;

System.out.println((int) mult);     // 1
System.out.println(mult);           // 4611686014132420609
System.out.println((double) mult);  // 4.6116860141324206E18
Run Code Online (Sandbox Code Playgroud)

如果计算需要更多位,可以考虑BigInteger(对于整数)或BigDecimal(对于十进制数).


Zer*_*nes 5

2147483647*2147483647 = 4611686014132420609

其中在Hexa = 3FFFFFFF 00000001中,截断后仅剩下00000001,其代表1.