黑马程序员技术交流社区

标题: byte b = (byte)130; //结果为-126 为什么啊? [打印本页]

作者: 南柯一梦境    时间: 2015-5-11 22:28
标题: byte b = (byte)130; //结果为-126 为什么啊?
byte b = (byte)130;   //结果为-126,结果是-126真心的不知道是怎么得到的,有木有大神给解答一下,最好详细点。谢谢

作者: shenkeyangguang    时间: 2015-5-11 23:00
数据130默认是int类型的十进制数据
第一步十进制的130转换成二进制数据
1 0 0 0 0 0 1 0
第二步130是int类型是占4个字节的,所以在内存的表现形式是
00000000  00000000  00000000  10000010
做了截取后的结果为
10000010
通过观察最高位符号位是1,这是一个负数,因为在计算机中所有的数据都是以补码的形式出现的所以要算它的补码
原码:1 0000010    原码变反码,最高位符号位不变,其他数值位1变0,0变1得反码
反码:1 1111101    反码变补码就是反码加1得
补码;1 1111110
最终的看到的结果就是
1     1111110最高为是符号位不运算,数值为转化为十进制是64+32+16+8+4+2=126符号位负
所以为-126
作者: Troy-Fu    时间: 2015-5-11 23:10
简单的说,就是int有4个字节,byte有一个字节,在进行强制类型转换时把前面的三个自己去掉了,则二进制的符号位成了1,所以返回的是一个负数,根据剩下的二进制进行转换,数值位运算后126,所以130在强转为byte后的值是-126
作者: 追忆似水年华    时间: 2015-5-11 23:20
130的二进制是10000010,而byte最小-128为1000 0001,126为01111110加负数就是取反加1就是10000010,130默认为int型占四字节转化为byte后去一字节,二进制相同所以为-126.
作者: 黄冬    时间: 2015-5-11 23:36
楼上讲的好详细
作者: 杨海林    时间: 2015-5-11 23:41
byte 类型的有效位是-128~127,超出范围就会舍弃,这样用2进制把前面去掉,第一个是符号位,所以,就是-126
作者: 欧阳文    时间: 2015-5-11 23:43
byte 类型的有效位是-128~127,溢出了
作者: 逆流而上    时间: 2015-5-11 23:51
对的,超出范围就会被舍弃,根据第一个符号位,程序会自动得出是-126
作者: 雪风飞花    时间: 2015-5-12 00:47
byte最大值只能存到127,超出范围后会按二进制换算成byte范围的值的
作者: 我干阿衰    时间: 2015-5-12 01:39
130的二进制是10000010其为补码,由最高位是1,所以他是负数,
补码求反码减1得反码为10000001,再将反码按位取反最高位除外得原码为11111110
再通过8421码表得其为-126.
作者: guowei    时间: 2015-5-12 07:13
哥们飘过···
作者: YQliang    时间: 2015-5-12 08:17
评论很详细啊  学习了
作者: iamnoten    时间: 2015-5-12 11:05
二楼正解
作者: 虎鹏    时间: 2015-5-12 12:20
楼上好牛啊!!!
作者: Hison_lian    时间: 2015-5-12 12:29
超出byte的取值范围(-128--127),损失精度了
作者: guoqiangmailbox    时间: 2015-5-12 17:34
byte 字节 超出存储的位数的 大小:0 - 255,取值范围是-128~127
作者: brouse    时间: 2015-5-12 21:23
130超过了byte的范围,超过的部分不能用8个二进制位表示
作者: 守株人    时间: 2015-5-12 21:50
讲的好详细啊,长知识了
作者: bboyXiaoNuo    时间: 2015-5-12 21:54
byte范围-128~127
作者: 南柯一梦境    时间: 2015-5-17 20:34
shenkeyangguang 发表于 2015-5-11 23:00
数据130默认是int类型的十进制数据
第一步十进制的130转换成二进制数据
1 0 0 0 0 0 1 0

太详细了,非常感谢啊。之前有段时间比较忙没顾上看看,谢谢了
作者: zy18692243338    时间: 2015-5-17 21:27
超过界限了,
作者: 王连涛    时间: 2015-5-17 21:47
2楼的哥们说的是对的
作者: shenkeyangguang    时间: 2015-5-18 23:22
shenkeyangguang 发表于 2015-5-11 23:00
数据130默认是int类型的十进制数据
第一步十进制的130转换成二进制数据
1 0 0 0 0 0 1 0

哥们不好意思啊,这个是我写错了,前几天忙没来得及改,下面的是正确算法

数据130默认是int类型的十进制数据
第一步十进制的130转换成二进制数据
1 0 0 0 0 0 1 0
因为计算机的所有数据都是以补码形式运行的所以130的二进制也要变成补码,因为它是正数所以它的补码是它本身
第二步补码130是int类型是占4个字节的,所以在内存的表现形式是
00000000  00000000  00000000  10000010
做了截取后的结果为
10000010
这就得到了补码,所以要变回我们日常看到的原码
补码:1 0000010    补码变反码,就是补码加-1
反码:1 0000001    反码变原码,符号位不变,数值为1变0,0变1;
原码;1 1111110
最终的看到的结果就是
1     1111110最高为是符号位不运算,数值为转化为十进制是64+32+16+8+4+2=126符号位负
所以为-126
作者: 代码搬运1号    时间: 2015-5-18 23:55
受教了!!!!!!!!
作者: 啊全    时间: 2015-5-19 00:06
楼主,,,,,
作者: mars_b0ZZ0    时间: 2015-5-19 00:17
int 4个字节 byte一个字节, 强转的过程中丢失了前面三个字节
作者: zq19910303    时间: 2015-5-20 08:48
终于掌握这个知识了
作者: 18530919536    时间: 2015-5-20 19:38
130超出范围了
作者: zhou330667146    时间: 2015-5-20 21:49
byte整数型范围是-128到127 当130强转成byte类型 发生溢出,例如128溢出,相当于最小的负数 结果(byte)128=-128,(byte)129=-127,(byte)130=-126  .......以此类推
作者: zhangjnia    时间: 2015-5-20 21:53
数据的原码,反码和补码都弄清楚了就知道了
作者: gaoer    时间: 2015-5-20 22:54
我也想问 ·!!!!!!!!!!!!
作者: 黯然残影    时间: 2015-5-21 00:40
byte的范围是-128~127
作者: 凉仁日记    时间: 2015-5-21 21:18
byte 类型的有效位是-128~127,超出范围就会舍弃,这样用2进制把前面去掉,第一个是符号位,所以,就是-126
作者: 姜秋艺    时间: 2015-5-21 22:13
1楼  已经告诉你结果了  你知道byte 的范围么?
作者: Jeremy_Yao    时间: 2015-10-10 20:36
我干阿衰 发表于 2015-5-12 01:39
130的二进制是10000010其为补码,由最高位是1,所以他是负数,
补码求反码减1得反码为10000001,再将反码按位 ...

刘意讲的为什么是10000010是原码
作者: 如梦丶似幻    时间: 2015-10-10 22:54
都说得好详细啊~~~~~~~
作者: JY.    时间: 2015-10-11 08:24
不错不错
作者: 大霉蛋    时间: 2015-10-11 12:18
老师昨天刚讲完
作者: 赵存金    时间: 2015-10-11 12:38
学习了。。。
作者: language    时间: 2015-10-11 14:00
老师刚讲~~~~~~~~~~~~
作者: ringfingers    时间: 2015-10-14 22:19
回头复习看到了=、=,get
作者: 土豆丝    时间: 2015-10-14 23:02
你要看看 源码,反码,补码!!!
作者: llyy    时间: 2015-10-16 15:20
shenkeyangguang 发表于 2015-5-11 23:00
数据130默认是int类型的十进制数据
第一步十进制的130转换成二进制数据
1 0 0 0 0 0 1 0

计算机二进制是以补码存储的   为什么输出来的时候  不用原码要用补码呢
作者: 赖洪光    时间: 2015-10-16 17:11
学习了,赞一个
作者: 止如初见    时间: 2015-10-16 17:32
byte 1字节,-2^7~2^7-1(-128~127);
short 2字节,-2^15~2^15-1;
int 4字节,-2^31~2^31-1;
long 8字节,-2^63~2^63-1;
^代表次方
作者: syb012    时间: 2015-10-16 18:26
本帖最后由 syb012 于 2015-10-16 18:36 编辑

知识回顾:
正数的原码反码补码都是它本身

负数的原码第一位表示符号, 其余位表示值。(负数的二进制原码最容易转换成十进制,比如原码1000 0001=-1,原码1000 0011=-3)
负数的反码是在其原码的基础上,符号位不变,其余各位取反。(从负数的原码很难一下子看出对应的十进制数是多少)
负数的补码是在其原码的基础上,符号位不变,其余各位取反,再加1。(同反码,补码也很难看出对应的十进制数是多少。计算机中都是用补码来表示数字的)


解决问题:
现在看130对应的二进制是int类型
0000-0000 0000-0000 0000-0000 1000-0010
强制转换成byte类型后 是1000-0010,丢失精度,可以看出变成了一个负数


因为计算机中都是用补码储存数字的,所以1000-0010是一个补码,想得出它对应的十进制数,必须把补码转换成原码。
负数的补码是在原码的基础上,符号位不变,各位取反,再加1。那么补码转换成原码就是相应的逆过程。


补码1000 0010
   - 0000 0001
----------------
     1000 0001
原码11111110=-126 (负数的原码第一位表示符号, 其余位表示值。)



所以那个被推荐的解答其实是错误的,那个解答混淆了原码反码补码。




作者: android小学徒    时间: 2015-10-16 19:07
学习了......
作者: C威    时间: 2015-10-16 22:20
看视频,byte类型的范围是-128~127
作者: syb012    时间: 2015-10-17 13:51
本帖最后由 syb012 于 2015-10-17 13:56 编辑

刚才看阳哥笔记复习之前看的视频,突然发现“原码转补码”和“补码转原码”的过程可以是一样的,都是符号位不变,各位取反,再加1。

之前的过程是
补码1000 0010
   - 0000 0001
----------------
     1000 0001
原码11111110=-126 (负数的原码第一位表示符号, 其余位表示值。)


其实也可以是
补码 1000 0010
      1111 1101
+   0000 0001
————————
原码1111 1110=-126


也就是说以后负数的十进制与二进制相互转换的方式可以这样:

负数的十进制————------------------负数的二进制原码————-----------------负数的二进制补码
     (负数的原码第一位表示符号,                           (从左往右与从右往左的过程是一样的,
         其余位表示值。可以很容易相互转换。)                   都符号位不变,各位取反,再加1。)
      

作者: 四夕    时间: 2015-12-21 23:14
厉害......学习了
作者: dg216888    时间: 2015-12-22 12:55
损失精度从大的向小的转
作者: 499087476    时间: 2015-12-22 14:22
to be honest, i came here just for getting coins
作者: Endless_paradox    时间: 2015-12-22 20:48
受教了。。
作者: houbofly    时间: 2015-12-22 22:08
回复太厉害了,牛
作者: 素心清影眉带笑    时间: 2016-3-24 14:05
超出byte的取值范围(-128--127),损失精度了
作者: winslow    时间: 2016-7-11 14:56
那byte a=(byte)128  ,128=1000 0000  ,我看的答案这里的1怎么即是符号位又是数值进行运算,最后结果-128.。
作者: Sbbbbbbbbbb    时间: 2016-7-11 15:19
因为byte的范围是-128~127。目前的值130明显溢出了




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