黑马程序员技术交流社区

标题: 关于强制转换溢出数据的算法问题 [打印本页]

作者: 一诺珍惜    时间: 2015-4-24 22:40
标题: 关于强制转换溢出数据的算法问题
下面是例子:
byte a=(byte)130;
由于byte的取值范围是(-127~127); 很明显130超出了取值范围。 输出的a值是-126,那么是怎么来的呢?以下是取值过程。
130的二进制是
原码/补码:00000000 00000000 00000000 10000010 因为是正的 所以原码和补码一样(计算机里的数据都是以补码的形式进行计算和存储的)
那byte截取原码 1  0000010 很明显最高位为1 那值是应该是个负数
               反码 1  1111101
               补码 1  1111110(反码+1)
那转换成十进制即为-126
那么同理 -130呢?
先转成2进制
原码:10000000 00000000 00000000 10000010
反码:11111111 11111111 11111111 01111101
补码:11111111 11111111 11111111 01111110
byte截取到的原码为
01111110 很明显为正  那原码和补码一致 即为126.

作者: 840800102    时间: 2015-4-24 22:47
顶起。。。顶起。。。顶起。。。
作者: GXJ1236987450    时间: 2015-4-24 23:07
懂了...........................
作者: kk8023    时间: 2015-4-24 23:13
亚麻跌~~~~亚麻得
作者: lixiaominls    时间: 2015-4-24 23:13
大神上课好认真啊~
作者: chniccs    时间: 2015-4-24 23:13
好牛好牛,好牛肉,来一块!
作者: 陈锐涛    时间: 2015-4-24 23:16

顶起。。。顶起。。。顶起。。。借鉴借鉴
作者: 若我成风    时间: 2015-4-24 23:20
小帅哥挺爱学的么
作者: 18561271203    时间: 2015-4-24 23:33
答案是对的,但是解法错了。截取后应该是补码,最后转成原码输出
作者: 黑影    时间: 2015-4-24 23:35
原来如此,参考揣摩去
作者: 马士基    时间: 2015-4-25 00:03
130超出byte表示范围,所以自动转为int,当将int转为byte时,只取最低八位,然后八位中最高位为1,所以为负,然后其余位取反末位加1,得绝对值126,所以最后结果为-126,另外byte表示范围是-128~127,楼主注意!
作者: Chans_宇    时间: 2015-4-25 00:29
本帖最后由 Chans_宇 于 2015-4-25 00:39 编辑

计算机底层运算的是补码,显示的是原码,所以截取后的是补码。
强转截取后:
补码:10000010
反码:10000001
原码:11111110

我记得是这样……
作者: Jampo    时间: 2015-5-14 21:39
赞一个!太牛了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2