A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朝哥 中级黑马   /  2012-6-13 14:21  /  2098 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Text
{
        public static void main(String[] args)
        {
                byte b =2;
                b+=127;
                System.out.println(b);
        }
}
我想知道-127是怎么来的?请画二进制图。

9 个回复

倒序浏览
本帖最后由 江南 于 2012-6-13 14:45 编辑

当达到了byte 128 的时候已经超过了 byte的最高位 byte的范围是-128-127 精度损失
回复 使用道具 举报
byte类型 8位 正上限值二进制01111111 最高位0表正数
01111111 + 1 = 10000000 byte发生溢出 符号位溢出进位成1 1表示负号
10000000+1=10000000+1(-127)
直接看成一个表盘  正上方是 -1 ,0  正下方是 -128,127     顺时针  右边由0--->127 然后-128  -127--->-1  后回0
回复 使用道具 举报
江南 发表于 2012-6-13 14:35
当达到了byte 128 的时候已经超过了 byte的最高位 byte的范围是-128-127 精度损失

请看清题意!
回复 使用道具 举报
Linsanity 发表于 2012-6-13 14:36
byte类型 8位 正上限值二进制01111111 最高位0表正数
01111111 + 1 = 10000000 byte发生溢出 符号位溢出进 ...

10000000+1=10000000+1(-127)
怎么变-127的?
回复 使用道具 举报
没有一个人会吗?
回复 使用道具 举报
这个。。。。你是想要什么结果?
00000010+01111111=10000001;
10000001的最高位是符号位,表示负数,然后取反加1求的原码,符号位不变,补码:10000001转换为原码:11111111 ;
因为是负数,所以是-127
回复 使用道具 举报
吴扬 中级黑马 2012-6-13 19:24:51
8#
因为b的类型是byte的,在内存当中占了8位,也就是0000 0010,在内存当中,第一位是符号位,为0就是整数,为1就是负数,而对b进行加127的操作之后,也就是0000 0010 + 0111 1111,结果是1000 0001,第一位变成了1,也就是成了一个负数,而剩下的7位:000 0001则是它实际值,这个是补码形式,它的原码对应的十进制数就是127,所以结果就是-127。这个是计算机组成原理方面的内容,楼主可以去参考下相应的教材。
回复 使用道具 举报
  0111 1111
+0000 0010
=1000 0001
byte类型是8位,最大值是128.2+127超出了最大范围,产生溢出。
得到的结果的最高位是1,表示是负数,000 0001是它的值表示。负数的值都是补码表示,所以这个值的十进制值是-127
回复 使用道具 举报
byte型的最大数为0111 1111,也就是127.你多加了2,就变成了int型,即 0000 0000 0000 0000 0000 0000 1000 0001,然后再复制给b的时候,会强制转型,舍掉前面的3个八位,于是就是1000 0001。这样最高位就是1,那么就是负数。它的二进制表现形式应该就是最高位之后的数字取反,再加1.
即1000 0001除最高位取反后为1111 1110,然后再加1,就是1111 1111。显然,这就是byte型的最小数,也就是-128!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马