#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
Комментариев нет:
Отправить комментарий