Java中long与double类型正负零的表示差异及原理探究
Java中long类型正负零的位表示机制
你观察到的浮点数正负零的差异完全符合IEEE-754标准——浮点数用符号位区分正负零,所以0.0和-0.0的位表示有明显区别(符号位分别为0和1)。但整数类型(比如long)的情况完全不同,核心原因是Java的整数类型采用**补码(Two's Complement)**编码。
在补码规则里,整数的零只有唯一的位表示:64位全0(对应long类型)。这是因为补码中对数值取负的操作是「按位取反后加1」,对0执行这个操作时:
- 0的64位全是0,按位取反得到全1的位模式
- 给全1加1会触发溢出,最终回到全0的位模式
所以从数学定义上,-0L这个表达式在补码体系下等价于0L——它不是一个独立的“负零”值,就是普通的零。
回到你的代码:
long posz = 0L; long negz = -0L;
编译器并不是“识别出二者都是零然后忽略符号”,而是根据补码的运算规则,-0L本身计算出来的结果就是0,所以最终两个变量的位模式都是64位全0,自然用无符号右移操作后输出的结果完全一致。
内容的提问来源于stack exchange,提问作者Mr T.
相关产品推荐
相关产品推荐

