2013-07-05 7 views
12

Я использую операцию ~ для манипуляций с битами, и мне просто интересно, как Java вычисляет отрицательное число?Как Java вычисляет отрицательные числа?

Я проверил документацию Java:

«Унарное поразрядное дополнение„~“инвертирует битовый шаблон, он может быть применен к любому из целочисленных типов, что делает каждый„0“„1“ и каждый «1» a «0». Например, байт содержит 8 бит, применяя этот оператор к значению, бит-бит которого «00000000» изменит его шаблон на «11111111» ».

Так что если int a = 60 (0011 1100), то int c = ~a (1100 0011).

Вопрос в том, как Java вычисляет отрицательные числа так, чтобы 1100 0011 = -61? Единственный способ 1100 0011 рассчитывается -61 является

  1. старший бит является знаковым битом.
  2. -2^6 + 2^1 + 2^0 = -61.

Но для меня это не имеет никакого смысла.

+3

You 'на правильном пути, причем старший бит является битом знака. См. [Дополнение от 2] (http://en.wikipedia.org/wiki/Two's_complement). – rgettman

+0

бит-бит используется для double и float, что означает, что у вас 0.0 и -0.0, целые числа не выполняются таким образом, а 'char' - без знака. –

ответ

12

Предполагает, что старший бит является простым значком является неправильным. Java, а также большинство современных языков программирования (и аппаратных архитектур) используют так называемое представление two's complement для чисел. (Сам бит, по совпадению, указывает знак, но не так, как вы ожидали, т.е. 150 и -150 имеют больше различий, чем только знаковый бит в их представлении.)

Это представление может показаться странный выбор, но на самом деле он делает операции, такие как добавление положительного числа к отрицательному числу (или вариации этого), автоматически, без необходимости обработки процессором особых случаев.

По the relevant Wikipedia article:

Система полезна в упрощении реализации арифметики на компьютерном оборудовании. Добавление 0011 (3) в 1111 (-1) сначала, кажется, дает неверный ответ 10010. Однако аппаратное обеспечение может просто игнорировать самый левый бит, чтобы дать правильный ответ 0010 (2). Для проверки операций переполнения все еще должны существовать такие операции, как суммирование 0100 и 0100. Таким образом, система позволяет добавлять отрицательные операнды без схемы вычитания и схему, которая обнаруживает знак числа. Кроме того, эта схема добавления также может вызывать вычитание, принимая два дополнения к ряду (см. Ниже), что требует только дополнительного цикла или его собственной схемы сумматора. Чтобы выполнить это, схема просто притворяется, что существует дополнительный бит слева от 1.

See this related answer for an even more in-depth explanation with lots of nice, easy to understand examples.

3

primitive numeral data types в Java - int, long, byte и short представлены в two's complement.Что это означает:

  • Значение высокий является результатом всех битов 1, за исключением MSB.
    • Пример: 0111 1111 = 127
  • Старший бит быть установлен в 1, а все остальные биты установлены в 0 является самым низким значение.
    • Пример: 1000 0000 = -128

Единственное отрицательное значение здесь является MSB, поэтому если мы разбить его на это представление, мы приходим к -61:

|-128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | 
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 

-128 + 64 + 2 + 1 = -61. 
Смежные вопросы