Страницы

Поиск по вопросам

четверг, 27 февраля 2020 г.

Алгоритм присваивания отрицательных значений какой-либо переменной в памяти

#java #операторы #cpu #ram #оператор_присваивания


К примеру, мне известно о том, что все отрицательные числа представляются в памяти
посредством дополнительного кода. Как это происходит? Русскоязычная терминология немного
отличается от той, которая была принята на Западе, поэтому было бы правильнее придерживаться
таких понятий, как первое (обратный код) и второе дополнения, чтобы не нарушать канонов.
С положительными значениями особых вопросов не возникает, так как прямой, обратный
и дополнительный код для этих значений абсолютно не отличается. А вот теперь мы и подошли
к первому вопросу. Меня интересует сам алгоритм присваивания отрицательных значений
какой-либо переменной. Поскольку я изучаю язык программирования Java, то хотелось бы
получить ответ именно в данном контексте (хотя я думаю, что для других языков разницы
также не будет, так как все операции физически осуществляются на уровне микропроцессора).
Правильно ли я понимаю, что за данное действие отвечает АЛУ (арифметико-логическое
устройство)? Или же какой-то другой блок процессора?

Здесь мне хотелось бы описать небольшой пример того, как я понимаю алгоритм присваивания
значения переменной. Допустим, что в нашем абстрактном коде имеется следующая инструкция: 

byte b = -5;


Изначально значение записывается в прямом коде, где старший бит является фиксированным
знаковым битом, который используется для кодирования знака числового значения в знаковых
типах данных. Получаем следующее двоичное представление: 

1000 0101


Затем мы получаем первое дополнение (обратный код). Для этого мы применяем инверсию
для каждого значащего разряда, которые участвуют в формировании самого числового значения.
Значение старшего разряда мы оставляем прежним. В результате инвертирования битов получаем
такой результат:

1111 1010


После чего мы добавляем к нашему результату 1, что и является вторым и результирующим
дополнением. В конечном итоге, в память будет помещено двоичное число, которое соответствует
числу -5 в десятичной системе счисления: 

1111 1011 


Но это всё лишь в моём представлении... Скажите, пожалуйста, насколько я прав? И
действительно ли обработкой всех этих операций занимается именно АЛУ? Если же я прав,
то значит ли это, что современные процессоры фактически не используют операцию вычитания
при арифметических расчётах? 

И еще вопрос, у меня уже давно возникла небольшая путаница с пониманием термина машинное
слово. В той же Википедии написано, что данная величина зависит от разрядности регистров
процессора. А от чего в свою очередь зависит эта разрядность? От типа данных в конкретном
языке программирования? Правильно ли я понимаю, что величина машинного слова типа byte
в языке программирования Java составляет 8 бит, short и char по 16 бит, а int 32 бита?
    


Ответы

Ответ 1



Да, смена знака в дополнительном коде производится инверсией битов и прибавлением единицы. как я понимаю алгоритм присваивания значения переменной Нет, не совсем так. Присваивание byte b = -5; не генерирует арифметических команд, только непосредственно присваивание значения 0xFB (-5). Любые арифметические выражения с константами сворачиваются на этапе компиляции. И действительно ли обработкой всех этих операций занимается именно АЛУ? Да, всей арифметикой занимается АЛУ, кто же еще. За исключением вычислений на этапе компиляции (которые в конечном итоге тоже выполняются АЛУ). значит ли это, что современные процессоры фактически не используют операцию вычитания при арифметических расчётах? Конечно, используют. Хотя вычитание можно выполнять в две команды - инверсия знака + сложение, одна команда вычитания выполняется быстрее. Но вот на уровне микропрограммы процессор может вычитание и не делать. И еще вопрос, у меня уже давно возникла небольшая путаница с пониманием термина машинное слово. В той же Википедии написано, что данная величина зависит от разрядности регистров процессора. А от чего в свою очередь зависит эта разрядность? Разрядность зависит от архитектуры процессора. У 32-разрядных процессоров машинное слово длиной 32 бита. У 64-разрядных соответственно 64 бита. Язык программирования тут не при чем, это аппаратная характеристика процессора.

Ответ 2



Главное преимущество дополнительного кода в том что сложение и вычитание работают одинаково как с положительными так и с отрицательными числами. -1 = 1111 1111 1 = 0000 0001 1 + 1 = 0000 0010 -1 + 1 = 0000 0000 -- из-за переполнения. -1 + -1 = 1111 1110

Комментариев нет:

Отправить комментарий