为什么127+1是等于-128

电脑不解释 2013-03-12 12:57:24
java中字节型数据范围是-128~127;为什么-128-1就会等于127;127+1又等于-128了呢?到底怎么算的啊?
...全文
1512 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liononoil 2013-09-28
  • 打赏
  • 举报
回复 1
引用 5 楼 abc41106 的回复:
java中byte类型作计算,都会先转换成int类型再计算。 比如 byte b = 127 + 1;//这样写报错:Type mismatch: cannot convert from int to byte 所以必须强制类型转换: byte b = (byte) (127 + 1); 因此就能理解为什么是-128了: int型的127在计算机内的二进制是: 0000 0000 0000 0000 0000 0000 0111 1111 加1后变成: 0000 0000 0000 0000 0000 0000 1000 0000 即128 强制转换后截取低8位变成 1000 0000 这是byte类型-128的补码。
哥们,那能帮忙解释一下-127-128吗?为什么结果会是1 -127: 1111 1111 + -128: 1000 0000 如果如果截断的话,是不是 = 127 0111 1111 但是结果是1呢。 如果我这么理解 -128 1000 0000 减127 - 127 0111 1111 = 1 0000 0001 这样的话就是1了,麻烦解释一下吧
cjb20103163 2013-03-14
  • 打赏
  • 举报
回复
public class Demobyte { /** * @param args */ public static void main(String[] args) { byte a=127; byte b=1; byte c = (byte)(b+a);//-128 //byte 类型 的 运算 要是没哟 float 和double 里面的运算都是 int 型 的运算 ,, 然后 再 强制类型转换成byte类型 System.out.println(c); byte d=-1; byte e= -128; byte f= (byte)(d+e);//127 System.out.println(f); } } 楼上说的很好 。。 就是这样的 要是没有 float 和 double 就 转换 为 int 运算 。。 算好之后 在强制类型转换 为 byte !!
Einstein_Jack 2013-03-14
  • 打赏
  • 举报
回复
溢出问题!楼上说的很清楚了!
火光闪耀 2013-03-13
  • 打赏
  • 举报
回复
127的二进制: 0111 1111 -128的二进制:1000 0000
VintNee 2013-03-13
  • 打赏
  • 举报
回复
127+1=-128 这个问题五楼已经说得很清楚了 至于为什么-128-1=127 原因: -128:1000 0000 1:0000 0001 根据补码的计算:x+y=[x]+[y], x-y=[x]+[-y].x+y的变补 至于变补的概念,去查吧 所以: -128+1的变补: 1000 0000 1111 1111 结果: 10111 1111 取前八个0111 1111=127
abc41106 2013-03-13
  • 打赏
  • 举报
回复
引用 11 楼 diannaojuebuhuicuo 的回复:
上面的你们说的都是原码在加减,计算机中的计算是原码间的进行还是补码之间进行运算啊??谢谢啦
计算机里是补码 你仔细理解,按原码计算和按补码计算都是一样的,因为最后存储在计算机里的都是补码。
  • 打赏
  • 举报
回复
计算机组成原理没有学好
电脑不解释 2013-03-12
  • 打赏
  • 举报
回复
上面的你们说的都是原码在加减,计算机中的计算是原码间的进行还是补码之间进行运算啊??谢谢啦
attach_finance 2013-03-12
  • 打赏
  • 举报
回复
首先你肯定声明的是byte类型的,然后字节长度是8位,最左位是符号位,0为正数,1为负数 127:0111 1111 0 :0000 0001 相加:1000 0000 然后要明白第一位是1为负数,他的绝对值=补码+1,也就是0111 1111+0000 0001为128,所以最后结果是-128
pretent 2013-03-12
  • 打赏
  • 举报
回复
数据溢出,byte 一个字节8为只能保存,256个数字,byte 从 -128到 +127, 最大的再加 >1的数就会数据溢出,最小的再减 >1的也会溢出. 127+1 = -128; 127+2 = - 127; 127+3 = -126; -128 - 1 = 127; 不光是byte类型,short、int、long、float、double 都会数据溢出。其实5楼分析的很充分了。
shine333 2013-03-12
  • 打赏
  • 举报
回复
希望你用的是win7,打开附件里面的计算器。查看>程序员 下面数字键左边选择,十进制和字节 输入127,你可以看到数字下边的二进制 0111 1111 然后+1,你会看到二进制很正常的变成了 1000 0000, 但是显示的是-128 因为最高位是符号位
idm2008 2013-03-12
  • 打赏
  • 举报
回复
引用 6 楼 demeanor 的回复:
楼上讲的到是挺详细的,byte字节占8位,127+1就溢出了,计算机进行运算时,以补码形式进行运行,最前面一位是符号位,所以就变成-128了
+1
大海之粟 2013-03-12
  • 打赏
  • 举报
回复
楼上讲的到是挺详细的,byte字节占8位,127+1就溢出了,计算机进行运算时,以补码形式进行运行,最前面一位是符号位,所以就变成-128了
abc41106 2013-03-12
  • 打赏
  • 举报
回复
java中byte类型作计算,都会先转换成int类型再计算。 比如 byte b = 127 + 1;//这样写报错:Type mismatch: cannot convert from int to byte 所以必须强制类型转换: byte b = (byte) (127 + 1); 因此就能理解为什么是-128了: int型的127在计算机内的二进制是: 0000 0000 0000 0000 0000 0000 0111 1111 加1后变成: 0000 0000 0000 0000 0000 0000 1000 0000 即128 强制转换后截取低8位变成 1000 0000 这是byte类型-128的补码。
wiksys 2013-03-12
  • 打赏
  • 举报
回复
支持
引用 3 楼 Ada168855 的回复:
这是二进制相加减的溢出问题
Ada168855 2013-03-12
  • 打赏
  • 举报
回复
这是二进制相加减的溢出问题
liwenpinghk 2013-03-12
  • 打赏
  • 举报
回复
溢出!最大的int + 1 = 最小的int
  • 打赏
  • 举报
回复
字节长度是8位,最左位是符号位 127的二进制: 0111 1111 -1的二进制: 1111 1111,加一为全0, -2的二进制: 1111 1110 …… -128的二进制: 1000 0000 因而 127+1=-128

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧