Java 7二进制文字澄清

时间:2012-01-08 12:49:09

标签: java java-7

如您所知,二进制文字是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,这是最大值文字二进制文件。

这是一个错误吗?或者它与签名/未签名的号码有关?

5 个答案:

答案 0 :(得分:20)

您使用的是有符号整数。位32(左起第一个)是符号位。它是1表示它是负数,0表示正数。然后执行二进制补码以给出-1的值。在这里阅读:

http://tfinley.net/notes/cps104/twoscomp.html

答案 1 :(得分:5)

这根本不是一个错误:因为int是无符号的,所以1 的所有位意味着-1。

有符号整数的最左边位,是二进制补码,是符号位。因此,你所期待的是什么。

答案 2 :(得分:4)

确实这是一个签名的int,所以是0xffff == 0b11111111111111111111111111111111 == -1。

这不是正数。

另见维基百科Two's complement

答案 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。有关详细信息,请参阅链接。