byte类型取值范围以及溢出详解

CSDN 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012959829/article/details/38704077

 

例1:

public class test {
    public static void main(String[] args) {
        byte a = 127 ;
        a = (byte)(a+3) ;
        System.out.println(a);
    }
}

输出-126,为什么呢
byte类型的取值范围是-128-127
这个输出结果是由java编码方式决定的,Java中正数用原码表示,负数用补码表示,第一位是符号位。
对于127他的编码是:
0000 0000 0000 0000 0000 0000 0111 1111
加上3也就是130,他的编码是:
0000 0000 0000 0000 0000 0000 1000 0010
使用强制转型后,a的编码就变成:
1000 0010
因为java第一位为1的为负数,负数用补码表示,所以要显示原码,要取反加1:
这样就变成 0111 1110
这样就是126加上符号,结果就是-126


例2:

public class test {
    public static void main(String[] args) {
        short a = 128 ;
        byte b = (byte)a ;
        System.out.println(b);
    }
}
输出-128,为什么呢

同上:

a的编码是:

0000 0000 1000 0000

强制转型后变为1000 0000

因为java第一位为1的为负数,负数用补码表示,所以要显示原码,要取反加1:

还是1000 0000

这样就是128加上符号,结果就是-128

例3:


public class test {
    public static void main(String[] args) {
        byte a = (byte)(-129) ;
        System.out.println(a);
    }
}
输出127,为什么呢

同上:

a的补码是:

1000 0000 0000 0000 0000 0000 1000 0001

a的原码是:

0111 1111 1111 1111 1111 1111 0111 1111

强制转换,取后面8个字节,也就是

0111 1111

所以结果是127

转载自作者:Benjamin_whx 

 


   然后我有补充。。我觉得我转载的例3有问题。-129的补码应该是1111 1111 1111 1111 1111 1111 0111 1111.-129的原码应该是0000 0000 0000 0000 0000 0000 1000 0001.尤其是强制转换时,上面的例3说取后面8个字节,他取的是原码的后面的低8位,这很可能是错误的,因为Java中负数的存储是用补码来存储的,也就是强制转换时,会取-129的补码的低8位,按照我说的就是取的0111 1111,虽然我的想法和他的想法最后得到的结果都是127.但是这个过程,我觉得我的是正确的。虽然我也没有足够的证据证明我的想法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值