黑马程序员技术交流社区

标题: 弱弱的问一个关于字节的问题,求大神解答! [打印本页]

作者: 钟成军    时间: 2012-6-10 23:27
标题: 弱弱的问一个关于字节的问题,求大神解答!
有2个byte类型的变量bb=126、bb2=5,当执行bbl=(byte)(bb+bb2);语句之后,bb1的值是怎么来的,求解答!
public class Test {
/**
  * @param args
  */
public static void main(String[] args) {
   byte bb = 126,bb2 = 5,bb1;
  bb1 = (byte)(bb+bb2);
  System.out.println(bb1);//bb1的输出值是-125,不懂为什么,求大神解答下,谢谢!
}
}

作者: 杨天皓    时间: 2012-6-10 23:36
byte的取值范围在-128~127之间,

如011....1111是最大值,011.....1111+1,如果正好越界,将重新变成最小值

作者: 王广丛    时间: 2012-6-10 23:47
本帖最后由 王广丛 于 2012-6-10 23:49 编辑

这个问题是这样的,按照二进制字节进行计算,126是二进制01111110,5的二进制是101,二进制相加得到10000011,而得到的这个值转换成十进制找好事-125,其实这个结果是由于二进制计算的溢出造成的
作者: 钟成军    时间: 2012-6-10 23:51
杨天皓 发表于 2012-6-10 23:36
byte的取值范围在-128~127之间,

如011....1111是最大值,011.....1111+1,如果正好越界,将重新变成最小 ...

但是-125是怎么来的呢,能讲清楚点吗?谢谢!
作者: 赵兵锋    时间: 2012-6-10 23:54
126 + 1 = 127;//此时还未溢出
126 + 2 = -128;//此时溢出,相当于127+1,0111 1111 加上1是1000 000,这是-128.
126 + 3 = -127;//此时溢出,相当于127+2,0111 1111 加上0010是1000 001,这是-127.
126 + 4 = -126;//此时溢出,相当于127+3,0111 1111 加上0011是1000 010,这是-126.
126 + 5 = -125;//此时溢出,相当于127+4,0111 1111 加上0100是1000 011,这是-125.
作者: 张立江    时间: 2012-6-10 23:56
赵兵锋 发表于 2012-6-10 23:54
126 + 1 = 127;//此时还未溢出
126 + 2 = -128;//此时溢出,相当于127+1,0111 1111 加上1是1000 000,这是-1 ...

回答的非常详细 顶一下
作者: 钟成军    时间: 2012-6-11 00:11
王广丛 发表于 2012-6-10 23:47
这个问题是这样的,按照二进制字节进行计算,126是二进制01111110,5的二进制是101,二进制相加得到1000001 ...

谢谢,已解决!
作者: 钟成军    时间: 2012-6-11 00:11
谢谢大家回答,已解决!
作者: 王广丛    时间: 2012-6-11 21:20
由于本人有关计算机组成原理的知识早就忘完了,所以上次回答具体细节确实记不清楚了....今天翻箱倒柜,把书找了出来,
于是就把详细计算过程附上,由于不能上传图片,所以以附件形式上传,楼主下载看一下吧

IMG_20120611_210311[1].jpg (350.46 KB, 下载次数: 25)

IMG_20120611_210311[1].jpg

作者: 钟成军    时间: 2012-6-11 21:58
呵呵,懂了,谢谢




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