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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaochongbojue 中级黑马   /  2014-10-28 09:11  /  1369 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. System.out.println(Integer.toBinaryString(b&255));
复制代码
  1. System.out.println(Integer.toBinaryString((byte)b));
复制代码

第一段程序输出结果是八位二进制,而第二段的输出结果却是32位的二进制,这是什么原因呢,求解答

8 个回复

倒序浏览
Integer.toBinaryStirng(int i),接受的类型是int型,你的(byte)b依然是int类型参数,所以结果是32位二进制也就不足为怪了。至于第一个为什么是8位我想你应该知道,因为是b&255取得是后8位,前面的那些无效的0没有显示。
回复 使用道具 举报 1 0
yueyazhishang 发表于 2014-10-28 09:39
Integer.toBinaryStirng(int i),接受的类型是int型,你的(byte)b依然是int类型参数,所以结果是32位二进制 ...

你这么说,我还是有一点不明白。那为什么(byte)b 的输出结果前24位使用1填充的呢,我这里有一点糊涂
回复 使用道具 举报
本帖最后由 striker 于 2014-10-28 10:06 编辑

刚测试过,这个要看b的值,如果b=1,那么这两个都是打印1,因为前边全是0,也就是说Inteter.toBinaryString会自动把前边的0去掉。楼上说的自动提升是对的。
  1.        int b=-1;
  2.                 System.out.println(Integer.toBinaryString(b&255));
  3.                 System.out.println(Integer.toBinaryString((byte)b));
复制代码

打印

  1. 11111111
  2. 11111111111111111111111111111111
复制代码

如果
  1. int b=1;
  2.                 System.out.println(Integer.toBinaryString(b&255));
  3.                 System.out.println(Integer.toBinaryString((byte)b);
复制代码

打印

  1. 1
  2. 1
复制代码
回复 使用道具 举报
xiaochongbojue 发表于 2014-10-28 09:44
你这么说,我还是有一点不明白。那为什么(byte)b 的输出结果前24位使用1填充的呢,我这里有一点糊涂 ...

不好意思,我的理解有一些偏差。
b&255取b的低八位,这个毫无疑问。
Integer.toBinaryString(b)是将32位的int转化为二进制的字符串,注意:前面会省略一些0,所以看起来是表示一个负数,其实不然。
(byte)b效果也是取int的低八位.不同的是如果b大于127,也就是byte的最大值那么表示一个负数。这时参考API,解释为:public static String toBinaryString(int i)
以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。 如果参数为负,该无符号整数值为参数加上 2的32次方;否则等于该参数。

也就是说如果b>127,那么Integer.toBinaryString((byte)b)得到的不在是b本身的二进制形式
希望对你有所帮助。


回复 使用道具 举报
yueyazhishang 发表于 2014-10-28 10:59
不好意思,我的理解有一些偏差。
b&255取b的低八位,这个毫无疑问。
Integer.toBinaryString(b)是将32位 ...

涨姿势了,巩固基础
回复 使用道具 举报
yueyazhishang 发表于 2014-10-28 10:59
不好意思,我的理解有一些偏差。
b&255取b的低八位,这个毫无疑问。
Integer.toBinaryString(b)是将32位 ...

涨姿势了,巩固基础
回复 使用道具 举报
计算机表示的数是以补码表示的,正数的补码是它本身,负数的补码取反再加一
比如-6的补码是11111111111111111111111111111010
正常的-6表示是10000000000000000000000000000110 (原码)
然后取反结果是11111111111111111111111111111001 (反码)
接着加一结果是11111111111111111111111111111010 (补码)
回复 使用道具 举报
chensc 金牌黑马 2014-10-29 21:58:24
9#
学习学习!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马