我认为不需要多解释,为什么以下计算结果为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.
如果要保留信息,则必须使用long
64位的类型进行乘法运算:
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
(对于十进制数).
2147483647*2147483647 = 4611686014132420609
其中在Hexa = 3FFFFFFF 00000001中,截断后仅剩下00000001,其代表1.
归档时间: |
|
查看次数: |
322 次 |
最近记录: |