【java小识】 byte x =(byte) (127+1)结果是-128的缘由

  • Post author:
  • Post category:java


前置知识:

  1. 计算机底层是以二进制0101的形式存储机器数的,显示人类语言和多媒体则是因为软件的翻译;
  2. 机器数符号位0为正数,1为负数,这个数有原码(其本身),反码(原码取反,0变1这种),补码(反码加1),但是正数的三码相同,都是其本身;
  3. 机器数符号位前面,负数用1填充,正数用0填充;
  4. 重点:计算机组成原理里定义的补码(唐朔飞第二版p222),自己理解的,一个n位的负机器数,补码(最高位是符号位,用逗号隔开) = 2^(n+1)+原码 ,补码定义,例子:原码 -1101 补码=2^(4+1)+(-1101)= 10 0000-1101 = 1,1111(逗号前表示符号位)
  5. java中用1个字节(一个字节byte有8个比特bit,一个bit存储一个0或者1,是计算机存储最小单位)来存储byte类型的数组,其范围规定为-128到127之前(- 2^7 到 2^8,最高位表示符号位)。

针对 byte x =(byte) (127+1):

 127补码   0111 1111  
 x  的 补码   1000 0000  正数三码相同,符号位会右溢出(byte是8
 bit), 变成 1000 0000,新符号位是1,x 变成了负数 
x 的原码 = 2^(8+1)-1000 0000 = 10 0000 0000 - 1000 0000 =  1,1000 0000  最高位是符号位,是1,没问题,转成十进制就是 -128
所以 x = -128;
依次类推的  byte  x =(byte) 129 = -127
...
可知 java中byte的值超过规定范围后会变换符号,具体公式 :a为十进制输入原数,b为十进制输出数  b  =  a-256,其实就是补码的定义应用。 

也可以在知道结果的情况下验证:
-127原码   1111 1111
-127反码   1000 0000
-127补码   1000 0001
-128就是-127-1 ,-128补码就是在-127补码基础上减去1 
-128补码  1000 0000 
```



版权声明:本文为myjkxcsdn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。