Процессоры семейства 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
усё
Необходимо определить размер целого типа. 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
усё
0x8000 = 0b.1000.0000.0000.0000
0x100 = 0b.0000.0001.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
Байт это 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
Старший бит установлен в единицу.
X & 0x8000 != 0
X & 0x8000 != 0
Похожие вопросы
- Особенности арифметических операций в C++, деление отрицательных чисел, вопрос ниже
- При делении отрицательного числа выводит не правильный ответ (assembler). Если беру числа 127 13 10, пишет переполнение
- Деление отрицательного числа. Ассемблер
- Число ноль это положительное или отрицательное число.
- Отрицательные числа и дополнительный код
- НА C# НАПИСАТЬ КОД Найти сумму целых отрицательных чисел, кратных 5 и принадлежащих интервалу [-20; 20].
- Дан целочисленный двумерный массив, размерности n х m. Заменить все отрицательные числа нулем
- Даны 3 целых числа. Возвести в квадрат отрицательные числа и в третью степень - положительные (число 0 не изменять)
- Ассемблер. Определить наименьшее число из из чисел меньши 2Eh
- Ассемблер. Определить найменьшее число из чисел, меньших 2Еh