gpt4 book ai didi

Java长赋值令人困惑

转载 作者:行者123 更新时间:2023-11-29 09:39:16 25 4
gpt4 key购买 nike

为什么这个java代码

long a4 = 1L;
long a3 = 1;
long a2 = 100L * 1024 * 1024 * 1024;
long a1 = 100 * 1024 * 1024 * 1024;
System.out.println(a4);
System.out.println(a3);
System.out.println(a2);
System.out.println(a1);

运行时输出

1
1
107374182400
0

而不是预期的

1
1
107374182400
107374182400

输出?

最佳答案

 long a2 = 100L * 1024 * 1024 * 1024;

但是在这一操作中至少有一个操作数是long。因此该操作使用 64 位精度执行,并且数值运算符的结果是 long 类型。另一个非长操作数是通过数字提升扩展为 long 类型,结果值存储到变量 a2

 long a1 = 100 * 1024 * 1024 * 1024;

普通整数的常量表达式,表达式的结果计算为 int 类型。然而,计算值太大而无法放入整数中,因此溢出,导致 0 并存储到 a1 变量中。

编辑:如以下评论所述:

Why doesn't it go negative?

因为在 整数计算 中,第二次计算等同于 25 * 2^32 其中 ^ 具有幂的含义,而 2^32 整数值为 0。但是,要解释为什么它的值为 0: 在二进制中:

 100 * 1024 * 1024 * 1024 == 25 * 2^32;

Integer.MAX_VALUE = 2 ^ 31 -1 = 0 11111111 11111111 11111111 1111111
Integer.MAX_VALUE + 1 = 2 ^ 31 = 1 00000000 00000000 00000000 0000000

2 ^ 31 是负整数(-2147483648),因为符号位是 1 因此 2 ^ 32 只是 22 ^ 31 的乘法:左移,符号位将变为 0,因此结果为0

查看 java language specification: 4.2.2: Integer operation了解详情。

关于Java长赋值令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20353529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com