整型类型128转byte为什么是-128

 public static void main(String[] args) {
        short a = 128;
        byte b = (byte) a;
        System.out.println(b);
    }

相信很多人都知道上面代码运行的结果是-128 ,但这又是为什么了

大家都知道short的长度为16个bit位 所以在int中128的二进制表示为  0000 0000 1000 0000
java在强转时 如果是长位转短位保留与短位数相同的长位末尾的二进制值,所以b的二进制表示为1000 0000但1000 0000转化为十进制为128,为什么在byte中会表示成-128呢?

学习过计算机的同学都知道在计算机中数字二进制 最高位为符号位,1代表负值,0代表正值。并且是以补码(正数的补码和原码相同,负数的补码是在原码的基础上各位取反然后加 1。)的形式存储的。但1000 0000的原码还是1000 0000。

下面从两个角度理解-128的补码为什么是1000 0000.

从补码的意义上去理解 

因为:256-128=256+(-128)的补码 --(机器中只有加法)。减法会变成补码的加法。

而      256-128=128 
所以   256+(-128)的补码=128 
所以           (-128)的补码=256-128 
                 (-128)的补码 =128 (1000 0000)

0000 0000   0000 0000     0
1000 0001   1111 1111    -1
1000 0010   1111 1110    -2
1000 0011   1111 1101    -3
    ...          .. 补码不断-1...
1111 1111   1000 0001 -127
无法表达     1000 0000 -128

所以规定8位二进制中1000 0000表示位-128  因此当其他整型128转化为byte时为-128

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值