黑马程序员技术交流社区

标题: 大家帮忙看看这个程序 [打印本页]

作者: xiaochongbojue    时间: 2014-10-28 09:11
标题: 大家帮忙看看这个程序
  1. System.out.println(Integer.toBinaryString(b&255));
复制代码
  1. System.out.println(Integer.toBinaryString((byte)b));
复制代码

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

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

你这么说,我还是有一点不明白。那为什么(byte)b 的输出结果前24位使用1填充的呢,我这里有一点糊涂
作者: striker    时间: 2014-10-28 10:03
本帖最后由 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
复制代码

作者: yueyazhishang    时间: 2014-10-28 10:59
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本身的二进制形式
希望对你有所帮助。



作者: maralbertlee    时间: 2014-10-28 11:28
yueyazhishang 发表于 2014-10-28 10:59
不好意思,我的理解有一些偏差。
b&255取b的低八位,这个毫无疑问。
Integer.toBinaryString(b)是将32位 ...

涨姿势了,巩固基础
作者: maralbertlee    时间: 2014-10-28 11:29
yueyazhishang 发表于 2014-10-28 10:59
不好意思,我的理解有一些偏差。
b&255取b的低八位,这个毫无疑问。
Integer.toBinaryString(b)是将32位 ...

涨姿势了,巩固基础
作者: 旭辉lin    时间: 2014-10-28 11:37
计算机表示的数是以补码表示的,正数的补码是它本身,负数的补码取反再加一
比如-6的补码是11111111111111111111111111111010
正常的-6表示是10000000000000000000000000000110 (原码)
然后取反结果是11111111111111111111111111111001 (反码)
接着加一结果是11111111111111111111111111111010 (补码)




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