黑马程序员技术交流社区

标题: 关于强转溢出问题 [打印本页]

作者: 刘明月    时间: 2012-9-3 00:33
标题: 关于强转溢出问题
毕老师的视频曾经提到强转就类似于将能放下四两米的碗中的东西放进只能装一两米的碗中,那么,如果四两米的碗中装的是四两的米,放进只能装一两米的碗中就会出现溢出现象,但是如果我把int a=232;进行强转为byte类型时为什么是负数???
作者: 杨千里    时间: 2012-9-3 01:01
int a =126  
byte b =(byte)a;
这属于低精度往高精度的强制转换,由于byte的取值范围是-128~127,超出127就会发生精度的损失,

如果a的值大于128
int a = 232
byte b = (byte)a;
这种情况会发生精度的损失,所以是负数,至于为什么是负数,你可以参阅二进制的原理
作者: 夏天    时间: 2012-9-3 07:08
byte 1字节,既8位。如果全是1,既1111 1111 既2的8次方-1,既2的7次方。但首位是1,此数既是负数。所以byte的取值范围是-128~127。
232的 2进制为....0000 1110 1000。用byte来装,既取最后8位,第一位为1,肯定是负数了。

再来看怎么求1110 1000。因为负数的二进制既正数的2进制取反+1
所以我们只要减1再取反就可以了。既11100111取反,既00011000,也就是负24了。
作者: 夏天    时间: 2012-9-3 10:01
求+分啊。。。。。。
作者: 马林康    时间: 2012-9-3 14:51
要搞清这个问题首先要搞清几个概念:原码,反码和补码
1.原码
将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。
为了简单起见,我们用1个字节来表示一个整数。
     +7的原码为: 00000111
     -7的原码为: 10000111
2.反码
一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1,其余各位是对原码取反。
为了简单起见,我们用1个字节来表示一个整数:
     +7的反码为:00000111
     -7的反码为: 11111000
3.补码
补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。为了简单起见,我们用1个字节来表示一个整数:
+7的补码为: 00000111
-7的补码为: 11111001
已知一个负数的补码,将其转换为十进制数,步骤:
      1、先对各位取反;
      2、将其转换为十进制数;
      3、加上负号,再减去1。
      例如:
      11111010,最高位为1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。
计算机中数值是以补码的形式存储的!
所以


作者: zhaosenyang    时间: 2012-9-3 21:57
int类型数据在内存中是4个字节32位
232 的二进制是0000 0000 0000 0000 0000 0000 1110 1000

byte的类型在内存中是一个字节8位,最大值为0111 1111~1111 1111即127~-128,

在二进制中,最高位为1,即为负数,int类型是32位,而byte类型是8位,在强转的时候,会把8位以上的全部舍弃,余下1110 1000,最高为是1,那么当然是负数了,即-24。
你也可以这么想,数据如果超出byte类型的范围,强制赋值,那么结果就会超过127以后从-128再转回去,232-127=105,超出了105位,从-128开始,跑105个数,就是-24了。这么想,你能理解不?





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