Каковы особенности хранения 32-битного целого числа со знаком в регистре?

Мой тип чисел - это целое число со знаком в виде двух чисел.

В регистрах памяти%rdi/edi/di у меня 0xFFFFFFFF. В%rsi/esi/si у меня 0x80000000.

Моя инструкция addl %edi, %esi,

Как мне правильно добавить это?

Я думаю, что ответ:

Поскольку я добавляю полный 32-битный регистр, я получаю преимущество добавления полных сумм 0xFFFFFFFF и 0x80000000.

Итак, к подписанному добавлено целое число со знаком, и оба они 32-разрядные. Я эффективно добавляю -2147483648 и 0x80000000. Поскольку 0x80000000 - это 2147483648 в шестнадцатеричном формате, я добавляю эти два и получаю ноль.

Флаг нуля активирован Флаг переноса активирован (так как я добавляю старшее значение 32-битного регистра)

1 ответ

Решение

В 32-битном двух дополнениях, 0xFFFFFFFF представляет -1, и 0x80000000 представляет -2,147,483,648. Сумма из них составляет -2,147,483,649. Это не вписывается в 32 бита, поэтому оно переполняется. Вычисленный результат будет 0x7FFFFFFF, что составляет 2 147 483 647.

На уровне битов: FFFFFFFF плюс 80000000 производит 17FFFFFFF, что значит 7FFFFFFF хранится в 32-разрядном месте назначения, а 1 это выполнение.

Другие вопросы по тегам