Altifigence Academy

2 / 24 · Теория

Разрядности, знаковое расширение и переполнение

На числовых примерах разграничьте интерпретацию, расширение и сужение.

Отделяйте битовый шаблон от его смысла

Восьмибитный шаблон 1111_1101 представляет беззнаковое 253 или знаковое -3 в дополнительном коде. Хранимые биты одинаковы, но сравнения и расширения различаются. Восьмибитное знаковое значение лежит от -128 до 127, а беззнаковое — от 0 до 255. Разрядность определяет количество представимых шаблонов, а знаковость — их числовую интерпретацию.

Расширяйте беззнаковое 253 нулями при переходе к шестнадцати битам. Знаково расширяйте -3 повторением исходного старшего бита, получая 1111_1111_1111_1101. Расширение нулями превратило бы -3 в 253. В SystemVerilog явно задавайте типы и разрядности операндов перед вычислением; не предполагайте, что конкатенация или выбор части разрядов сохраняет задуманную знаковую интерпретацию.

SystemVerilog
logic [7:0] ua, ub;
logic [8:0] usum;
logic signed [7:0] sa, sb;
logic signed [8:0] sax, sbx, ssum;
assign usum = {1'b0, ua} + {1'b0, ub};
assign sax = {sa[7], sa};
assign sbx = {sb[7], sb};
assign ssum = sax + sbx;

Здесь оба входа становятся девятибитными до сложения. Беззнаковое 255+1 даёт 256, а затем ноль в младших восьми битах. Знаковое 127+1 тоже даёт математическое 128, но сужение до знаковых восьми бит даёт -128. Перенос сообщает о беззнаковой границе; знаковое переполнение — о знаковой. Сложение операндов одного знака с изменением знака результата указывает на знаковое переполнение. Сложение -1 и 1 может дать перенос без знакового переполнения.

Планируйте и промежуточные разрядности. Наибольшее произведение двух беззнаковых восьмибитных чисел равно 65025 и требует шестнадцати бит. Четыре беззнаковых восьмибитных значения могут дать сумму 1020, для которой нужны десять бит. Усечение каждой частичной суммы до восьми бит теряет информацию, которую более широкий итоговый регистр уже не восстановит.

ОперацияШирокий результатИнтерпретация после сужения
беззнаковое 255+12560 с переносом
знаковое 127+1128-128 с переполнением
знаковое -3+2-1-1 без переполнения

Используйте предупреждения WIDTH в Verilator, чтобы исследовать непреднамеренные изменения разрядности. Проверки Node в этом курсе выполняют числовые модели, а не эти фрагменты HDL. Проверяйте ноль, крайние значения и разные знаки, прежде чем считать обычные положительные примеры доказательством правильности.

Попробуйте сами

Найдите результат знакового расширения восьмибитных -3 и 2 до девяти бит и их сложения. Также найдите минимальную разрядность для точной суммы четырёх беззнаковых значений 255.

Прочитать объяснение

Девятибитные операнды — 111111101 и 000000010. Их сумма — 111111111, то есть -1. Четыре значения 255 дают 1020; девять беззнаковых бит ограничены 511, поэтому нужны десять бит.

Выбор действует в этом браузере. Его можно изменить внизу страницы.