java 中 byte 溢出详解,为什么 byte 130 结果为 -126

public class Main {
    public static void main(String[] args) {
        byte b = (byte) 130;
        System.out.println(b); // -126
    }
}

必备知识:

原码、反码、补码

原码:
就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码:
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码:
正数的补码与其原码相同;负数的补码是在其反码的末位加1。

回到正题

在 java 中 byte 130 的 130 默认是 int 类型(十进制),int 类型占用 4 个字节。

将十进制的 130 转化为二进制值为:

00000000 00000000 00000000 10000010

使用 byte 130 意思是强制类型转换,会将 int 类型强制转换为 byte 类型,强制转化过程会进行截取,结果为:

10000010

通过截取后的结果可以看到,符号位(最高位)为 1,说明这是一个负数

在计算机中所有的数据都是以补码的形式出现。所以求出截取后的数据的补码即可。

原码:10000010   
反码:11111101        原码变反码,最高位符号位不变,其他位取反,0变1,1变0
补码:11111110        反码变补码,末位加 1

求得 原码:10000010 的补码为 补码:11111110

最高位为符号位,为 1,代表负数。

剩下的7为数 1111110 转为十进制为:126

加上符号位即为: -126

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值