byte allBitsOne=0xFF;        //Wrong!!事实上,这将导致编译器报错。字面值0xFF是1111 1111,那这里报错的理由是什么?理由是0xFF 根本不是1111 1111。字面值是int型,所以其二进制值是0000 0000 0000 0000 0000 0000 1111 1111,碰巧等价于十进制数128,但128超过了byte型的数值表达范围。从而,byte型值1111 1111等价于十进制数-1,所以将变量allBitsOne初始化为所有位为1的正确方式应写成:byte allBitsOne=0xFFFFFFFF;  //Correct -well done!!现在编译器将会痛快地截掉高位的二进制位,以产生所要的结果。
上面的解释我没看懂:1 “碰巧等价于十进制数128”这句 不是应该是256么?
                            2 “byte型值1111 1111等价于十进制数-1” 即使是带符号的 也应该是-127啊还请高手详细说明 谢谢!

解决方案 »

  1.   

    1 “碰巧等价于十进制数128”这句 不是应该是256么? 
    java中byte是有符号的8位二进制,所以其真值部分只是后面7位
      

  2.   

      2 “byte型值1111 1111等价于十进制数-1” 即使是带符号的 也应该是-127啊 
    二进制表示和加减都是通过补码进行的。
    正数的补码是其自身,负数的补码是真值部分取反后加1。
    1111 1111是补码,真值部分是后七位1111 11111减一后1111 1110 
    取反1 000 0001,得到 -1
      

  3.   

    楼主上边说的解释都有点怪怪的,理解有误。感觉。
    public class Demo0
    {
        public static void main(String[] argv)
        {
            byte a = (byte)0xFF;
            byte b = (byte)0xFFFFFFFF;
            System.out.println(a);
            System.out.println(b);
        }
    }Process started >>>
    -1
    -1答案是一样的。
    0xFF刚好表示一个byte,哪里有错,第一个bit表示符号, 1为负,0为正。最大值为127(即0x7F), 最小值为-128(好0x80)
      

  4.   

    谢谢 toshiba_java 
    但是
    发表于:2008-03-22 10:33:271楼 得分:0 
    1 “碰巧等价于十进制数128”这句 不是应该是256么?  
    java中byte是有符号的8位二进制,所以其真值部分只是后面7位 

    我可以理解成1111 1111第8个bit是符号位(为负),1111 1111为-127么?2 “byte型值1111 1111等价于十进制数-1” 即使是带符号的 也应该是-127啊  
    二进制表示和加减都是通过补码进行的。 
    正数的补码是其自身,负数的补码是真值部分取反后加1。 
    1111 1111是补码,真值部分是后七位1111 11111减一后1111 1110  
    取反1 000 0001,得到 -1
    还是没明白  呵呵 我有点笨(二进制表示和加减都是通过补码进行的。 
    正数的补码是其自身,负数的补码是真值部分取反后加1。)括号里的能明白。
      

  5.   

    to iihero:
      public class Demo0
    {
        public static void main(String[] argv)
        {
            byte a = 0xFF;//lz说的是这样编译将报错
            byte b = 0xFFFFFFFF;//a b都没有用(byte)强制转换
            System.out.println(a);
            System.out.println(b);
        }
      

  6.   

    我可以理解成11111111第8个bit是符号位(为负),1111 1111为-127么?看什么情况了,如果您说的是原码为 1111 1111那么其数值为-127
    如果是byte型的补码则为-1例如
    byte类型十进制数字-1,原码为 1000 0001
    反码是                       1111 1110
    补码是                       1111 1111(这个就是十进制-1在java中的表示)-127
    1111 1111原码
    1000 0000反码
    1000 0001补码
      

  7.   

    呵呵,这样讲还是不太好
    我觉得您可以这样想  要给一个byte数字 b1 赋十进制的数值 i的话,
    需要先将 i转为自身的补码 “i补”后再赋给  b1
    例如要给 byte b1赋十进制的数值 -127的话,
    那么先把-127转为原码表示1111 1111
    再把原码取反            1000 0000
    再加一求补              1000 0001
    再把补码服给b1就可以了1000 0001的16进制表示是 0x81,
    如果这样写 byte b1 = 0x81;//编译报错,原因就是你上面说的
    所以要这样 byte b1 = 0xFFFFFF81; //ok,搞定