理解数值差异
在提供的代码片段中,两个乘法运算之间的明显差异源于缺少或存在附加到数值后的“L”字符:
long oneYearWithL = 1000*60*60*24*365L; long oneYearWithoutL = 1000*60*60*24*365;
附加“L”以确保长值
在第一个表达式中,“L”后缀表示长整型文字,表示该值应被视为 64 位整数。此乘法的结果是每年 31536000000 毫秒的长值。
缺少“L”会导致整数值
在第二个表达式中,没有“ L”后缀,乘法运算产生一个整数值。在这种情况下,结果是 1471228928,而预期值应超过 30 亿毫秒。
整数溢出和截断
出现差异是因为四乘的结果32 位整数(1000、60、60 和 24)除以第五个 32 位整数 (365) 超出了整数范围,即 [-2^31, 2^31-1]。结果回绕,在第二个表达式中产生错误值 1471228928。
转换为 2 的补码表示
在没有“L”后缀的情况下,如果整数相乘的结果为负且超出整数范围,则在分配给整型变量之前将其转换为 2 的补码表示形式。此转换确保负值可以在整数范围内表示。
确保正确的结果
要获得正确的结果,必须声明数值通过附加“L”来超出整数范围的长整型值,以确保正确的表示并避免截断或转换为 2 的补码表示。
以上是为什么在 Java 中向数值添加“L”会极大地改变乘法运算的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!