如您所知,二进制文字是Java 7中引入的一项新功能:
int x = 0b1011;
System.out.println(x); // prints 11 as expected
但是,当我尝试从文字二进制文件中获取最大数字时,我得到-1
!!!
int x = 0b11111111111111111111111111111111;
System.out.println(x); // prints -1 !!!
更多详情:
System.out.println(Integer.MAX_VALUE);
System.out.println(0b1111111111111111111111111111111); // 31 bits
/* Both print 2147483647 */
/************************************************************************************/
System.out.println(Integer.MIN_VALUE);
System.out.println(0b10000000000000000000000000000000); // 32 bits (increment by 1)
/* Both print -2147483648 */
/************************************************************************************/
// And if you keep increasing the binary literal, its actual value
// will be decreased until you reach the maximum binary literal and
// its actual value will be -1.
System.out.println(0b11111111111111111111111111111111); // 32 bits
/* Prints -1 */
正如您所看到的,文字二进制文件的实际值(增量)从最大值int
跳到最小值,然后继续减小直到达到-1,这是最大值文字二进制文件。
这是一个错误吗?或者它与签名/未签名的号码有关?
答案 0 :(得分:20)
您使用的是有符号整数。位32(左起第一个)是符号位。它是1表示它是负数,0表示正数。然后执行二进制补码以给出-1的值。在这里阅读:
答案 1 :(得分:5)
这根本不是一个错误:因为int是无符号的,所以1 的所有位意味着-1。
有符号整数的最左边位,是二进制补码,是符号位。因此,你所期待的是什么。
答案 2 :(得分:4)
答案 3 :(得分:2)
Java使用32位有符号整数,最大/最小值和最大值你看到的溢出结果是有效的。
有关详细信息,请参阅:http://en.wikipedia.org/wiki/Integer_(computer_science)
答案 4 :(得分:2)
Java的int
使用2's complement个有符号整数。这意味着 最左侧 位表示负数。所以
int x = 0b11111111111111111111111111111111;
// ^--- this bit
表示该数字为负数。所有其他位也为1的事实意味着该数字是(十进制)-1。有关详细信息,请参阅链接。