Другие языки программирования и технологии

Как определить отрицательные числа?

Процессоры семейства 80x86 трактуют отрицательные числа, как двоичные дополнения (которые содержат единичный бит в старшем разряде ). Чтобы получить отрицательное число надо инвертировать все биты и добавить единицу.

Как определить, какие числа отрицательные:

0x8000
0x100
0x7fff
0x0ffff
0x0fff

Объясните, пожалуйста подробно как показать что 0х8000 - отрицательное и 0х100 - положительное, я не понимаю порядок действий
попытка №2
Необходимо определить размер целого типа. 1/2/4/8 байт. Одно и тоже битовое представление м. б. при разной длине > или < нуля
В записи это отражается ведущими нулями. нпрм 0хff =-1 в 1м байте, а х00ff=255 в 2х байтах и т. д
Получить с обратным знаком
- 0хff инвертировать 0х00, прибавить 1 0х01=1
- 0х00ff инвертировать 0хff00, прибавить 1 0хff01=-255
усё
Роман Тян
Роман Тян
56 274
Лучший ответ
0x8000 = 0b.1000.0000.0000.0000
0x100 = 0b.0000.0001.0000.0000
Попытка номер 3. Для примера возьмём байт, как самый маленький.

Байт это 8 бит или 2 шестнадцатеричные цифры.
Нам надо в этом байте хранить нули, положительные и отрицательные числа.

с нулем всё понятно: 0(10) = 0000 0000 (2) = 0x00 (16)
с маленьким положительными тоже: 5(10) = 0000 0101 (2) = 0x05 (16)

а вот с отрицательными плохо - число -a: нужно составить из битов такое число, чтобы если к нему добавить a, то стало 0.

Для простоты возьмём 1 и попытаемся получить -1.
Заметим что двоичное число из единиц подходит как -1 (как заметим: а просто все переберем)
0000 0001 + 1111 1111 = 1 0000 0000 = 0000 0000 - из-за того, что в байте только 8 бит старшая единица не поместится, это называют переполнением.

Можно получать отрицательные числа в байте, отнимая от 0x100(16) = 256 (10) положительное число.
Например -5 = 0x100 - 0x05 = 0xFB = 1111 1011 (2)

Эта формула замечательно выглядит, но 0x100 в байт не влазит, а поэтому придумали, как не вылезать:
0000 0101 = 5
1111 1010 = инверсия 5
1111 1011 = инверсия 5 + 1 = -5

При этом самый старший бит принято считать признаком, что число отрицательное. То есть:
1000 0000 = 0x80 = -128 - самое маленькое отрицательное
0111 1111 = 0x7F = 127 - самое большое положительное

А теперь ОТВЕТ НА ВОПРОС: у отрицательных чисел старший бит = 1
На практике это означает, что старший байт в шестнадцатеричном виде >= 0x80.

Важное замечание.
Если мы говорим, что байт - число со знаком, то байт 0xFB = -5, а если без знака, то 0xFB = 251.

Важное замечание №2.
-5 длиной 2 байта = 0xFFFB, а 4 байта = 0xFFFF FFFB
СМ
Сергей Мухин
11 112
Старший бит установлен в единицу.
X & 0x8000 != 0