Начнем с обобщения примитивных типов данных Java:
byte : Тип данных Byte - это 8-битовое знаковое целое число с дополнением до двух .
Кратко : Краткий тип данных - это 16-разрядное целое число с дополнением до двух со знаком .
int: Тип данных Int представляет собой 32-битное знаковое целое число с дополнением до двух .
long: тип данных Long - это 64-битное целое число с дополнением до двух со знаком .
float: тип данных с плавающей запятой представляет собой 32-битное число с плавающей запятой одинарной точности IEEE 754 .
double : тип данных double - это 64-битный IEEE 754 с плавающей запятой двойной точности .
boolean: логический тип данных представляет один бит информации .
символ: тип данных char - это один 16-битный символ Unicode .
Источник
Два дополнения
"Хороший пример взят из взят вики что связь с дополнением до двух реализована, если отметить, что 256 = 255 + 1, а (255 - x) - это дополнение x до единиц x
0000 0111 = 7 двойное дополнение равно 1111 1001 = -7
как это работает, MSB (самый старший бит) получает отрицательное значение, поэтому в случае выше
-7 = 1001 = -8 + 0+ 0+ 1
Положительные целые числа обычно хранятся как простые двоичные числа (1 равно 1, 10 равно 2, 11 равно 3 и т. Д.).
Отрицательные целые числа хранятся как два дополнения их абсолютного значения. Дополнение до двух положительного числа - это при использовании этого обозначения отрицательное число.
Источник
Поскольку я получил несколько баллов за этот ответ, я решил добавить к нему дополнительную информацию.
Более подробный ответ:
Среди прочего, существует четыре основных подхода к представлению положительных и отрицательных чисел в двоичном формате, а именно:
- Знаковая величина
- Дополнение к одному
- Два дополнения
- Смещение
1. Знаковая величина
Использует старший бит для представления знака, остальные биты используются для представления абсолютного значения. Где 0 представляет положительное число, а 1 представляет отрицательное число , например:
1011 = -3
0011 = +3
Это представление проще. Однако вы не можете добавлять двоичные числа так же, как и десятичные числа, что затрудняет реализацию на аппаратном уровне. Более того, этот подход использует два двоичных шаблона для представления 0, -0 (1000) и +0 (0000) .
2. Дополнение к человеку
В этом представлении мы инвертируем все биты данного числа, чтобы найти его дополнительные. Например:
010 = 2, so -2 = 101 (inverting all bits).
Проблема с этим представлением заключается в том, что все еще существуют два шаблона битов для представления 0, отрицательного 0 (1000) и положительного 0 (0000).
3. Дополнение до двух
Чтобы найти отрицательное значение числа, в этом представлении мы инвертируем все биты, а затем добавляем один бит. Добавление одного бита решает проблему наличия двух битовых шаблонов, представляющих 0. В этом представлении у нас есть только один шаблон для
0 (0000) .
Например, мы хотим найти двоичное отрицательное представление числа 4 (десятичное), используя 4 бита. Сначала преобразуем 4 в двоичное:
4 = 0100
затем мы инвертируем все биты
0100 -> 1011
наконец, мы добавляем один бит
1011 + 1 = 1100.
Таким образом, 1100 эквивалентно -4 в десятичной системе, если мы используем двоичное представление с дополнением до двух с 4 битами.
Более быстрый способ найти дополнительный - установить первый бит как значение 1 и инвертировать остальные биты. В приведенном выше примере это будет примерно так:
0100 -> 1100
^^
||-(fixing this value)
|--(inverting this one)
Представление Two Complement, помимо того, что имеет только одно представление для 0, оно также добавляет два двоичных значения таким же образом, как и в десятичном, четные числа с разными знаками. Тем не менее, необходимо проверить случаи переполнения.
4. Смещение
Это представление используется для представления показателя степени в норме IEEE 754 для чисел с плавающей запятой. Его преимущество состоит в том, что двоичное значение со всеми битами, равными нулю, представляет наименьшее значение. И двоичное значение со всеми битами, равными 1, представляет наибольшее значение. Как видно из названия, значение кодируется (положительное или отрицательное) в двоичном формате с n битами со смещением (обычно 2 ^ (n-1) или 2 ^ (n-1) -1).
Таким образом, если мы используем 8 бит, значение 1 в десятичной форме будет представлено в двоичной системе с использованием смещения 2 ^ (n-1) на значение:
+1 + bias = +1 + 2^(8-1) = 1 + 128 = 129
converting to binary
1000 0001
binary as is
а числа -ve хранятся вtwo's complement
?Я запустил следующую программу, чтобы узнать это
public class Negative { public static void main(String[] args) { int i =10; int j = -10; System.out.println(Integer.toBinaryString(i)); System.out.println(Integer.toBinaryString(j)); } }
Выход
1010 11111111111111111111111111110110
Судя по выходным данным, он использовал два дополнения.
источник
11111111 11111111 11111111 11110110
. Ваш печатает, в то время как двоичный, как для 10, равен 1010. Значит, только числа -ve хранятся как два дополнения?Oracle предоставляет некоторую документацию по типам данных Java, которая может вас заинтересовать. В частности:
Кстати, short также хранится как дополнение до двух.
источник
e.g) For +ve number 10; byte representation will be like 0-000 0010 (0 - MSB will represent that it is +ve). So while retrieving based on MSB; it says it is +ve, so the value will be taken as it is.
например) при сохранении -10 тогда
0-000 0010 -> (1's complement) -> 0-111 1101 -> (2's complement) 0-111 1101 + 1 -> 0-111 1110 Now MSB will be set to one, since it is negative no -> 1-111 1110
при извлечении он обнаружил, что MSB установлен в 1. Так что отрицательное значение нет. И дополнение до 2 будет выполняться кроме MSB.
1-111 1110 --> 1-000 0001 + 1 --> 1-000 0010 Since MSB representing this is negative 10 --> hence -10 will be retrived.
Также обратите внимание, что когда вы приводите int / short к байту, только последний байт будет рассматриваться вместе с последним байтом MSB,
Возьмем, к примеру, короткий "-130", он может храниться, как показано ниже.
(MSB)1-(2's complement of)130(1000 0010) --> 1-111 1111 0111 1110
Теперь приведение байтов заняло последний байт, который равен 0111 1110. (0-MSB) Так как MSB говорит, что это + ve значение, поэтому оно будет принято как есть. Это 126. (+ ve).
Возьмем другой пример "130", он может храниться, как показано ниже.
0-000 000 1000 0010 (MSB = 0)
Теперь приведение байтов заняло последний байт, который равен 1000 0010. (1 = MSB) Поскольку MSB сообщает, что это значение -ve, будет выполнено дополнение до 2 и будет возвращено отрицательное число. Таким образом, в этом случае будет возвращено -126.
1-000 0010 -> (1's complement) -> 1-111 1101 -> (2's complement) 1-111 1101 + 1 -> 1-111 1110 -> (-)111 1110 = -126
(byte)-1 -> 0-000 0001 (2's Comp) -> 0-111 1111 (add sign) -> 1-111 1111 (char)(byte)-1 -> 1-111 1111 1111 1111 (sign bit is carry forwarded on left)
так же
(short)(byte)-1-> 1-111 1111 1111 1111 (sign bit is carry forwarded on left)
Но
(int)(char)(byte)-1 -> 0-0000000 00000000 11111111 11111111 = 65535 since char is unsigned; MSB won't be carry forwarded.
И
(int)(Short)(byte)-1 -> 1-1111111 11111111 11111111 11111111 = -1 since short is signed; MSB is be carry forwarded.
Почему для представления отрицательных чисел используется дополнение до двух?
Что такое «Дополнение 2»?
источник
Самый старший бит (32-й) указывает, что число положительное или отрицательное. Если он равен 0, это означает, что число положительное и сохраняется в его фактическом двоичном представлении. но если оно равно 1, это означает, что число отрицательное и сохраняется в его дополнительном представлении до двух. Итак, когда мы даем вес -2 ^ 32 32-му биту при восстановлении целочисленного значения из его двоичного представления, мы получаем фактический ответ.
источник
Согласно этому документу , все целые числа подписаны и хранятся в формате дополнения до двух для java. Не уверен в его надежности ..
источник
положительные числа хранятся непосредственно как двоичные. Комплимент 2 требуется для отрицательных чисел.
например:
15: 00000000 00000000 00000000 00001111
: 11111111 11111111 11111111 11110001
вот разница в битах со знаком.
источник
Спасибо, dreamcrash за ответ https://stackoverflow.com/a/13422442/1065835 ; на вики-странице они приводят пример, который помог мне понять, как узнать двоичное представление отрицательной копии положительного числа.
источник
Для положительного целого числа 2 значение дополнения совпадает с битом 0 MSB
(like +14 2'complement is 01110)
.Только для отрицательного целого числа мы вычисляем значение дополнения 2 '
(-14= 10001+1 = 10010)
.Итак, окончательный ответ: оба значения
(+ve and -ve)
хранятся только в форме дополнения 2.источник