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、0xFF 根本不是1111 1111。字面值是int型,所以其二进制值是0000 0000 0000 0000 0000 0000 1111 1111,碰巧等价于十进制数128怎么是等于128,而不是256呢?128是怎么算来的呢?2、如果将十进制数-127赋值给byte a的话,要如何表示?请教了,谢谢
System.out.println(allBitsOne); //-127
System.out.println(allBitsOne); //-127 -127 表示为:1111 1111
1000 0000
补码为:1000 0001
=0x8 1
byte allBitsOne = (byte)0xff; 强转过后就取末8位就是是-1了