提示:计算机中数据都是通过补码存储的,对于正数的表示就是二进制原码(因为正数的反码和补码都是原码),对于负数的表示用补码(负数的反码为原码符号位外其他位取反,负数的补码为原码的反码加一)。
大家可以计算下如下代码的输出结果是什么?
/* -128~127范围内的换算*/
byte n1=-128;
System.out.println("-128的int->byte:"+n1);
byte n2=127;
System.out.println(" 127的int->byte:"+n2);
/* 小于-128范围内的换算*/
byte n3=(byte) -129;
System.out.println("-129的int->byte:"+n3);
byte n4=(byte) -130;
System.out.println("-130的int->byte:"+n4);
/* 大于127范围内的换算*/
byte n5=(byte) 128;
System.out.println(" 128的int->byte:"+n5);
byte n6=(byte) 129;
System.out.println(" 129的int->byte:"+n6);
byte n7=(byte) 130;
System.out.println(" 130的int->byte:"+n7);
实际的输出结果为:
-128的int->byte:-128
127的int->byte:127
-129的int->byte:127
-130的int->byte:126
128的int->byte:-128
129的int->byte:-127
130的int->byte:-126
int类型的m转换为byte的规则为:对m的补码,截取后8位,并对截取后的二进制数进行求补码操作。
【-128】
原码为:1000 0000 0000 0000 0000 0000 1000 0000
反码为:1111 1111 1111 1111 1111 1111 0111 1111
补码为:1111 1111 1111 1111 1111 1111 1000 0000
截取后8位为:1000 0000,,负数的补码为原码的反码加1
反码为:1111 1111
补码为:1000 0000,即-128
【127】
原码为:0000 0000 0000 0000 0000 0000 0111 1111
截取后8位为:0111 1111
补码为:0111 1111,正数的补码为本身,即127
【-129】
原码为:1000 0000 0000 0000 0000 0000 1000 0001
反码为:1111 1111 1111 1111 1111 1111 0111 1110
补码为:1111 1111 1111 1111 1111 1111 0111 1111
截取后8位为:0111 1111,正数的补码为本身,即127
【-130】
原码为:1000 0000 0000 0000 0000 0000 1000 0010
反码为:1111 1111 1111 1111 1111 1111 0111 1101
补码为:1111 1111 1111 1111 1111 1111 0111 1110
截取后8位为:0111 1110,正数的补码为本身,即126
【128】
原码为:0000 0000 0000 0000 0000 0000 1000 0000
截取后8位为:1000 0000,负数的补码为原码的反码加1
反码为:1111 1111
补码为:1000 0000,即-128
【129】
原码为:0000 0000 0000 0000 0000 0000 1000 0001
截取后8位为:1000 0001,负数的补码为原码的反码加1
反码为:1111 1110
补码为:1111 1111,即-127
【130】
原码为:0000 0000 0000 0000 0000 0000 1000 0010
截取后8位为:1000 0010,负数的补码为原码的反码加1
反码为:1111 1101
补码为:1111 1110,即-126