1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 二进制加减溢出问题详解 byte类型加减溢出详解。

二进制加减溢出问题详解 byte类型加减溢出详解。

时间:2020-01-14 12:59:26

相关推荐

二进制加减溢出问题详解 byte类型加减溢出详解。

byte类型的数在JAVA中占1个字节,也就是8位,那么8位中除去一个符号位,表示数值的共有七位。

例如:1000 0000 中1就是符号位,表示负数。

0111 1111 中0也是符号位,表示正数。

剩余7位表示数值,根据二进制的计算方法,byte8位一共可以表示-128~127。

为什么正数只能表示到127,而负数可以表示到-128呢?

这涉及到了0的问题

1000 0000 按照之前的规定来看,首位1代表符号位,说明是负数,后7位代表数值0。这样看来,1000 0000就代表了-0这个数。

0000 0000 同理,按照之前的规定来看,首位0代表符号位,说明是负数,后7位代表数值0。这样看来,1000 0000就代表了+0这个数,0这个数是不需要使用2种正负去表示的,+0和-0这样就浪费了一个表示数值。所以规定1000 0000代表-128,第一位不止是符号位了,或者说,规定1000 0000就是-128,这样就导致了我们可以表示-128~127的数,正数比负数可以表示的数少一,就少在了这个-0上。

再说溢出问题

byte a = 127;byte b = -128;(byte)(a+1);(byte)(b-1);

这样就出现了一个问题,也就是溢出问题,因为byte只能表示8位,数值就是-128~127,现在127+1和-128-1都导致超出了byte所能表示的范围,那么就代表数据溢出了。

现在需要大家明白一个问题就是,计算机中,是使用补码进行运算的,正数的补码和原码还有反码都一样。但是负数就不一样。补码是源码取反+1.同理原码是补码取反+1.

明白了以上这个概念,我们就可以继续往下走了。

127是正数,所以表示为0111 1111.

127 + 1 = 128 表示位 1000 0000.

你可以发现现在符号值变成了1,从0变成1.那么现在在系统中就是表示为一个负数,我们可以发现这个数1000 0000和之前我们规定的-128的值是一样的,对127+1现在就转化成了-128.

同理-128是1000 0000,我们对它进行减一,那么就是-129 转化成二进制就是 11000 0001而在计算时需要转化成补码也就是 原码取反10111 1110 再+1 10111 1111,而我们byte只能放下8位,所以原本的符号位顶掉了,所以值就变为0111 1111,也就是127.这就是byte的溢出问题。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。