Как Java вычисляет отрицательные числа?
Я использую ~
операция для битовой манипуляции, и мне просто интересно, как Java вычисляет отрицательное число?
Я проверил документацию Java:
"унарный побитовый оператор дополнения" ~ "инвертирует битовый шаблон; его можно применить к любому из интегральных типов, делая каждый" 0 "a" 1 "и каждый" 1 "a"0". Например, байт содержит 8 бит; применение этого оператора к значению, битовым шаблоном которого является "00000000", изменит его шаблон на "11111111"."
если int a = 60 (0011 1100)
, потом int c = ~a (1100 0011)
.
вопрос в том, как Java вычисляет отрицательные числа, чтобы 1100 0011 = -61
? Единственный способ 1100 0011
рассчитывается -61
is
- самый высокий бит-бит знака.
-
-2^6 + 2^1 + 2^0 = -61
.
но для меня это не имеет смысла.
2 ответов
предположение, что самый высокий бит является простым знаковый бит и неправильно. Java, а также большинство современных языков программирования (и аппаратных архитектур) используют так называемый дополнение представление чисел. (Сам бит, по совпадению, указывает на знак, но не так, как вы ожидаете, то есть 150 и -150 имеют больше различий, чем просто бит знака в их представлении.)
Это представление сначала может показаться странным выбор, но на самом деле он делает такие операции, как добавление положительного числа к отрицательному числу (или вариации этого), автоматически работают, не заставляя процессор проверять особые случаи.
по данным соответствующая статья Википедии:
система полезна в упрощении реализации арифметики на компьютерном оборудовании. Добавление 0011 (3) к 1111 (-1) сначала кажется неправильным ответ 10010. Однако, аппаратные средства могут просто игнорировать самый левый бит, чтобы дать правильный ответ 0010 (2). Проверки переполнения все еще должны существовать, чтобы поймать операции, такие как суммирование 0100 и 0100. Поэтому система позволяет добавлять отрицательные операнды без схемы вычитания и схемы, которая обнаруживает знак числа. Кроме того, эта схема сложения также может выполнять вычитание, принимая дополнение двух чисел (см. ниже), которое требует только дополнительного цикла или своя собственная цепь сумматора. Для этого схема просто притворяется, что существует дополнительный левый бит 1.
в Java примитивные типы данных цифры - int
, long
, byte
и short
представлены в дополнение. Что это значит:
- на высокий значение является результатом всех битов, установленных в 1, за исключением MSB.
- пример:
0111 1111 = 127
- пример:
- MSB устанавливается в 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.