前置知识:
- 计算机底层是以二进制0101的形式存储机器数的,显示人类语言和多媒体则是因为软件的翻译;
- 机器数符号位0为正数,1为负数,这个数有原码(其本身),反码(原码取反,0变1这种),补码(反码加1),但是正数的三码相同,都是其本身;
- 机器数符号位前面,负数用1填充,正数用0填充;
- 重点:计算机组成原理里定义的补码(唐朔飞第二版p222),自己理解的,一个n位的负机器数,补码(最高位是符号位,用逗号隔开) = 2^(n+1)+原码 ,补码定义,例子:原码 -1101 补码=2^(4+1)+(-1101)= 10 0000-1101 = 1,1111(逗号前表示符号位)
- 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 版权协议,转载请附上原文出处链接和本声明。