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 “碰巧等价于十进制数128”这句 不是应该是256么?
2 “byte型值1111 1111等价于十进制数-1” 即使是带符号的 也应该是-127啊还请高手详细说明 谢谢!
java中byte是有符号的8位二进制,所以其真值部分只是后面7位
二进制表示和加减都是通过补码进行的。
正数的补码是其自身,负数的补码是真值部分取反后加1。
1111 1111是补码,真值部分是后七位1111 11111减一后1111 1110
取反1 000 0001,得到 -1
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)
但是
发表于: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。)括号里的能明白。
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);
}
}
如果是byte型的补码则为-1例如
byte类型十进制数字-1,原码为 1000 0001
反码是 1111 1110
补码是 1111 1111(这个就是十进制-1在java中的表示)-127
1111 1111原码
1000 0000反码
1000 0001补码
我觉得您可以这样想 要给一个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,搞定