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、0xFF 根本不是1111 1111。字面值是int型,所以其二进制值是0000 0000 0000 0000 0000 0000 1111 1111,碰巧等价于十进制数128怎么是等于128,而不是256呢?128是怎么算来的呢?2、如果将十进制数-127赋值给byte a的话,要如何表示?请教了,谢谢

解决方案 »

  1.   

    byte allBitsOne=(byte)0x81;
    System.out.println(allBitsOne);   //-127
      

  2.   

    byte allBitsOne=0xFF;        //Wrong!! 错误原因:0xFF == 255 ,已经超出了byte的范围了,所以不能赋给一个byte型的变量。byte allBitsOne=(byte)0x81;
    System.out.println(allBitsOne);  //-127   -127 表示为:1111 1111
                 1000 0000      
         补码为:1000 0001
              =0x8    1   
      

  3.   

    还有0xFF字面值是int类型的,也就是0000 0000 0000 0000 0000 0000 1111 1111,为什么碰巧等于128呢,
      

  4.   

    晚了,不強制轉換不就是int型嗎
      

  5.   

    我的理解:编译器编译的时候会把0xff看成int型值,0xff字面值是int型的255,而byte值范围是-127-128,所以会报错。0xffffffff=-1,在byte范围内,所以不报错。如果要把-127赋值给byte,byte a=-127;或者byte a=0xffffff81;
      

  6.   

    第二个疑问解决了,虽然0xFF字面值是int的255,int是32位的二进制,碰巧等于128,怎么得来的呢,而byte是8位的二进制数,取最后7位的话为11111111,等价于十进制数-1, 即使是带符号的 也应该是-127啊 
      

  7.   

    byte allBitsOne=0xFF不进行强转的话就相当于 byte allBitsOne=255;显然是错误的。
    byte allBitsOne = (byte)0xff; 强转过后就取末8位就是是-1了
      

  8.   

    但是0xFF 根本不是1111 1111。字面值是int型,所以其二进制值是0000 0000 0000 0000 0000 0000 1111 1111,碰巧等价于十进制数128这句要怎么解释呢
      

  9.   

    0xFF是0000 0000 0000 0000 0000 0000 1111 1111,十进制255,不是128