如您所知,二进制文本是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,这是文字二进制的最大值。
这是个虫子吗?还是与签名/无符号号码有关?
发布于 2012-01-08 12:52:20
你用的是有符号整数。位32 (左边的“第一个”)是符号位。它是1表示它是一个负数,0表示正。然后执行2的补码,给出-1的值。在这里读到:
http://tfinley.net/notes/cps104/twoscomp.html
发布于 2012-01-08 12:52:55
这根本不是一个错误:因为int是无符号的,所以所有位到1确实意味着-1。
有符号整数的最左边的位,在二的补码中,是符号位。因此,你所看到的是意料之中的。
发布于 2012-01-08 12:52:55
实际上,这是一个签名的int,所以0xffff == 0b1111111111111111111111111111111111111111111111111111 == -1。
这不是一个积极的数字。
也见维基百科二补。
https://stackoverflow.com/questions/8777640
复制相似问题