最近发现一个比较低级的问题,就是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。符合程序结果。