最近发现一个比较低级的问题,就是java中的数值表示。Java是使用补码表示数值的,但一直忽略了哪个是源码,哪个是补码。看这个简单的例子:
129显然超出了byte所表示的范围-128~127。127的二进制表示是01111111,则129应该表示为10000001,但是int和byte是有符号的。所以这个结果是-1,但这却是一个错误的结果,程序运行的真正结果是-127。
之所以会有这样的结果是因为Java使用补码表示的,127是整数,所以补码和原码是一样的,我们在对127进行+2操作时也是对补码进行,所以我们看到的100000001这个是补码,转换成原码是11111111,也就是-127。符合程序结果。
public class JavaTest {
public static void main(String[] args) throws Exception {
System.out.println((byte)129);
}
}129显然超出了byte所表示的范围-128~127。127的二进制表示是01111111,则129应该表示为10000001,但是int和byte是有符号的。所以这个结果是-1,但这却是一个错误的结果,程序运行的真正结果是-127。
之所以会有这样的结果是因为Java使用补码表示的,127是整数,所以补码和原码是一样的,我们在对127进行+2操作时也是对补码进行,所以我们看到的100000001这个是补码,转换成原码是11111111,也就是-127。符合程序结果。
本文探讨了Java中数值表示的方法,特别是对于超出byte类型范围的数值如何通过补码进行正确的解释。通过一个具体示例解释了当一个整数超过byte所能表示的最大值时,其在Java中的实际表现。
196

被折叠的 条评论
为什么被折叠?



