黑马程序员技术交流社区

标题: 为什么 结果 是10呢?请看一下下面代码 [打印本页]

作者: kevindavid    时间: 2012-5-23 21:11
标题: 为什么 结果 是10呢?请看一下下面代码
本帖最后由 kevindavid 于 2012-5-23 21:42 编辑

class  bytedemo
{
public static void main(String[] args)
{
  byte b;
  int i=266;
  b=(byte)i;
  System.out.println("byte="+b);
}
}
为什么打印结果是10呢

作者: 魏涞    时间: 2012-5-23 21:48
本帖最后由 魏涞 于 2012-5-23 21:57 编辑

不好意思,楼主,发错回答了,

作者: 罗文杰    时间: 2012-5-23 22:15
本帖最后由 罗文杰 于 2012-5-23 22:45 编辑

int是32位,byte8位,所以你将int转成byte当然只能取最低的8位了,266的int型二进制是0000 0000 0000 0000 0000 0001 0000 1010,所以第9位以上的都取不进来,所以是0000 1010 就是10了。补充下 第一位代表符号位,当强转后所剩8为第一位符号位为1的时候,所得的8位为byte数的补码,我们将它转为原码,即减一后再取反,但符号位不能变。举个例子,156的二进制表示为:1001 1100,强制转换后1001 1100是byte数的补码,将其减1后取反,得到:1110 0100,强转后也就是-100了 。
作者: 付左军    时间: 2012-5-23 22:15
因为在java中,int类型的占4个字节,而byte占1个字节,所以int类型转化为byte类型时会出现位丢失情况,即将int的低8位作为byte类型的值。int型变量的值为266,对应的二进制是100001010,后8位是00001010,第一个0表示符号位,表示正数,所以变量b的值为10。
作者: 张成龙    时间: 2012-5-23 23:00
int是32为的强制转换成byte后只保留了后8位,266超出了了byte的长度,所以转换之后的数和原来的不一样了
作者: kevindavid    时间: 2012-5-23 23:46
罗文杰 发表于 2012-5-23 22:15
int是32位,byte8位,所以你将int转成byte当然只能取最低的8位了,266的int型二进制是0000 0000 0000 0000  ...

谢谢啦!原来是用二进制的方法啊 看来我还没学好,要不是今天在书上看到这个问题可能一直都不知道是这个情况
作者: 攻城狮    时间: 2012-5-24 01:00
byte 1个8位也就是1个字节
int 4个8位也就是4个字节
byte取值范围-128~127 相当于3块一瓶的百事可乐
int取值范围  Integer.MIN_VALUE ~  Integer.MAX_VALUE  相当于一瓶7块全家型百事可乐
你把试试把7块的可乐倒到3块可乐的瓶子里就知道了
同理取值是10 就是你把7块的可乐倒到3块可乐的瓶子里3块钱可乐瓶子里面的可乐

作者: 孙如意    时间: 2012-5-24 07:24
呵呵,受教了,李版主的比喻好生动啊.......顶一下{:soso_e179:}
作者: 李斌    时间: 2012-5-24 09:32
李南江 发表于 2012-5-24 01:00
byte 1个8位也就是1个字节
int 4个8位也就是4个字节
byte取值范围-128~127 相当于3块一瓶的百事可乐

字没打出来 。。。 补充 :强大
作者: 李斌    时间: 2012-5-24 09:33
李南江 发表于 2012-5-24 01:00
byte 1个8位也就是1个字节
int 4个8位也就是4个字节
byte取值范围-128~127 相当于3块一瓶的百事可乐

补充两字 强大




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