关于汉字转成字节然后把它用二进制输出的问题

public static void main(String []args){
    String s="爱慕";
    byte[] bytes=s.getBytes();
    for(byte b:bytes){
        System.out.println(Integer.toBinaryString(b)+" ");
    }
}
输出结果是:

11111111111111111111111110110000 (ffffffb0 十六进制)
11111111111111111111111110101110 (ffffffae 十六进制)
11111111111111111111111111000100 (ffffffc4 十六进制)
11111111111111111111111110111101 (ffffffbd 十六进制)

这里一个字节用二进制表示占32位,怎么解释才能让其与一个字节占8位不冲突。

汉字转成 byte 后,每个字节的数值基本上都是大于 0x7F的,即是负值。
所以输出时,输出的结果前面都是 FF。

http://blog.csdn.net/androiddeveloper_lee/article/details/6619414

因为在gb2312编码下一个汉字占两个字节,所以bytes数组长度是4 里边的值为[-80, -82, -60, -67];
public static String toBinaryString(int i)
以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
如果参数为负,该无符号整数值为参数加上 232;否则等于该参数。将该值转换为二进制(基数 2)形式的无前导 0 的 ASCII 数字字符串。如果无符号数的大小为零,则用一个零字符 '0' (’\u0030’) 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。字符 '0' ('\u0030') 和 '1' ('\u0031') 被用作二进制数字。
你这个地方如果参数用个正数,输出的就是八位,

至于为什么输出32位我的理解是:代码Integer.toBinaryString(b)+" "虽然入参是byte类型,但java自动将byte转为了整型;整型占四个字节,不管正数负数都应该是32位,只是正数情况下这个方法把前24位给省略了。。。。11111111111111111111111110110000 这是-81的补码,首位不变(f符号位)其余位取反然后最后一位再加1即:10000000 00000000 00000000 01010000以上说得时猜测,说错了大神勿喷,,,下边是jdk源码,我没细看,
java 源码如下
public static String toBinaryString(int i) {
return toUnsignedString0(i, 1);
}
private static String toUnsignedString0(int val, int shift) {
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
char[] buf = new char[chars];

    formatUnsignedInt(val, shift, buf, 0, chars);

    // Use special constructor which takes over "buf".
    return new String(buf, true);
}
         static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
    int charPos = len;
    int radix = 1 << shift;
    int mask = radix - 1;
    do {
        buf[offset + --charPos] = Integer.digits[val & mask];
        val >>>= shift;
    } while (val != 0 && charPos > 0);

    return charPos;
}