A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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呢

9 个回复

倒序浏览
本帖最后由 魏涞 于 2012-5-23 21:57 编辑

不好意思,楼主,发错回答了,
回复 使用道具 举报
本帖最后由 罗文杰 于 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了 。
回复 使用道具 举报
因为在java中,int类型的占4个字节,而byte占1个字节,所以int类型转化为byte类型时会出现位丢失情况,即将int的低8位作为byte类型的值。int型变量的值为266,对应的二进制是100001010,后8位是00001010,第一个0表示符号位,表示正数,所以变量b的值为10。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
int是32为的强制转换成byte后只保留了后8位,266超出了了byte的长度,所以转换之后的数和原来的不一样了
回复 使用道具 举报
罗文杰 发表于 2012-5-23 22:15
int是32位,byte8位,所以你将int转成byte当然只能取最低的8位了,266的int型二进制是0000 0000 0000 0000  ...

谢谢啦!原来是用二进制的方法啊 看来我还没学好,要不是今天在书上看到这个问题可能一直都不知道是这个情况
回复 使用道具 举报
攻城狮 黑马帝 2012-5-24 01:00:43
7#
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块钱可乐瓶子里面的可乐

评分

参与人数 1黑马币 +10 收起 理由
李斌 + 10 很给力!比喻很形象一看就明白了 版主果然很.

查看全部评分

回复 使用道具 举报
呵呵,受教了,李版主的比喻好生动啊.......顶一下{:soso_e179:}
回复 使用道具 举报
李斌 中级黑马 2012-5-24 09:32:26
9#
李南江 发表于 2012-5-24 01:00
byte 1个8位也就是1个字节
int 4个8位也就是4个字节
byte取值范围-128~127 相当于3块一瓶的百事可乐

字没打出来 。。。 补充 :强大
回复 使用道具 举报
李南江 发表于 2012-5-24 01:00
byte 1个8位也就是1个字节
int 4个8位也就是4个字节
byte取值范围-128~127 相当于3块一瓶的百事可乐

补充两字 强大
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马