Разъяснение двоичных литералов Java 7 - PullRequest
2 голосов
/ 08 января 2012

Как вы знаете, двоичный литерал - это новая функция, представленная в 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 ]

20 голосов
/ 08 января 2012

Вы используете целое число со знаком. Бит 32 («первый» слева) является знаковым битом. Это 1 означает, что это отрицательное число, а 0 означает положительное. Затем выполняется дополнение к двум, чтобы дать значение -1. Читайте об этом здесь:

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

5 голосов
/ 08 января 2012

Это совсем не ошибка: поскольку int не имеет знака, все биты в 1 означают означает -1.

Самый левый бит целого числа со знаком, в дополнении к двум, равенбит знакаПоэтому ожидается то, что вы видите.

4 голосов
/ 08 января 2012

Действительно, это int со знаком, поэтому 0xffff == 0b11111111111111111111111111111111 == -1.

Это не положительное число.

См. Также Википедию Дополнение к двум * .

2 голосов
/ 08 января 2012

Java int использует 2 дополнения целые числа со знаком.Это означает, что крайний левый бит указывает отрицательное число.Так что

int x = 0b11111111111111111111111111111111;
//        ^--- this bit

означает, что число отрицательное.Тот факт, что все остальные биты также равны 1, означает, что число равно (десятичному) -1.Подробнее смотрите по ссылке.

2 голосов
/ 08 января 2012

Java использует 32-битные целые числа со знаком, и результаты max / min и переполнения, которые вы видите, действительны.

Для получения дополнительной информации см .: http://en.wikipedia.org/wiki/Integer_(computer_science)

...