为什么127+1是等于-128

为什么127+1是等于-128

社区

Java SE 帖子详情 为什么127+1是等于-128 电脑不解释 2013-03-12 12:57:24 java中字节型数据范围是-128~127;为什么-128-1就会等于127;127+1又等于-128了呢?到底怎么算的啊?

...全文

1533 18 打赏 收藏 为什么127+1是等于-128 java中字节型数据范围是-128~127;为什么-128-1就会等于127;127+1又等于-128了呢?到底怎么算的啊? 复制链接

扫一扫 分享 转发到动态 举报 AI 作业

写回复 配置赞助广告取 消

确 定

用AI写文章 18 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 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 打赏举报 回复 计算机组成原理没有学好 电脑不解释 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 15年老程创业中 2013-03-12 打赏举报 回复 字节长度是8位,最左位是符号位

127的二进制: 0111 1111

-1的二进制: 1111 1111,加一为全0,

-2的二进制: 1111 1110

……

-128的二进制: 1000 0000

因而 127+1=-128 为啥127+1是等于-128 为啥127+1是等于-128

为什么127+1是等于-128java中字节型数据范围是-128~127;为什么-128-1就会等于127;127+1又等于-128了呢?到

为什么127+1是等于-128 java中字节型数据范围是-128~127;为什么-128-1就会等于127;... 为什么byte类型127+1是 (-128) 一、为什么byte类型127+1是 (-128)

1.计算机中对数据的二进制存储形式-------补码(下面讨讨论的皆为byte类型)

原码:45:00101101 -45:10101101

在最高位代表符号位区分正数还是负数,0代表正数,1代表负数

反码:45:00101101 -45:11010010

正数的原码和反码相同,负数的反码等于原码的符号位不 为什么char数据类型127+1等于-128 我们知道,每一个数据类型都有自己的取值范围;那么char自然也不例外;

那么char数值在内存中是怎么变化的呢?

为什么127+1变成-128的呢?

下面将会讲明白

1.我们先了解char的大小是1个字节

char a=0;

a=00000000 =0

char a=1;

a=00000001 =1

a+2

a=00000010 =2

......

a+127

a=01111111 =127

a+128

a=10000000

... 为什么127+1=-128 +127在计算机中的二进制表示:0111 1111;(最高位0表示正数,1表示负数)

127+1,二进制就变成了:1000 0000;

计算机内部以补码进行负数运算,求其原码(除符号位外,各位取反并加1,),得到1000 0000,即128,又由于符号位为1,故1000 0000用十进制表示就是-128。

故有符号位byte的值范围为(-128,127)

...

Java SE

62,631

社区成员

307,264

社区内容

发帖 与我相关 我的任务 Java SE Java 2 Standard Edition 复制链接

扫一扫 分享 确定 社区描述 Java 2 Standard Edition 社区管理员

加入社区

获取链接或二维码

近7日

近30日

至今

加载中

查看更多榜单

社区公告

暂无公告 试试用AI创作助手写篇文章吧

+ 用AI写文章

相关文章

电e宝怎么用?电e宝注册图文教程
365bet亚洲真人

电e宝怎么用?电e宝注册图文教程

07-12 793
手机漂流瓶收不到回复
28365365体育在线备用

手机漂流瓶收不到回复

07-03 4574
fate所有英灵及介绍(fate所有英灵)
28365365体育在线备用

fate所有英灵及介绍(fate所有英灵)

07-10 2812
《dnf》追忆武器装扮全职业外观一览
28365365体育在线备用

《dnf》追忆武器装扮全职业外观一览

07-25 1321
空调主板在什么位置(如何轻松找到并更换)。
28365365体育在线备用

空调主板在什么位置(如何轻松找到并更换)。

07-10 5735
苹果平板电脑air2屏幕多少钱啊
28365365体育在线备用

苹果平板电脑air2屏幕多少钱啊

08-14 4986
微贷产品介绍
28365365体育在线备用

微贷产品介绍

07-15 7829
OPPO R9s分屏操作方法详解
365bet亚洲真人

OPPO R9s分屏操作方法详解

08-04 1718