前置知识:
- 计算机底层是以二进制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
```
文章讲述了计算机如何使用二进制表示机器数,包括原码、反码和补码的概念,特别是在Java中byte类型的存储和溢出情况。当byte类型的数值超出-128到127的范围时,会通过补码的计算规则改变符号,例如127+1会变为-128,这是因为符号位溢出并导致数值的负正转换。
1687

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



