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

文章讲述了计算机如何使用二进制表示机器数,包括原码、反码和补码的概念,特别是在Java中byte类型的存储和溢出情况。当byte类型的数值超出-128到127的范围时,会通过补码的计算规则改变符号,例如127+1会变为-128,这是因为符号位溢出并导致数值的负正转换。
摘要由CSDN通过智能技术生成

前置知识:

  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 
```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值