Номера сборок 6502 могут быть подписаны или не подписаны, в зависимости от того, установлен ли седьмой бит. Если оно со знаком, оно находится в диапазоне от -128 до 127, а если нет, то в диапазоне от 0 до 255. Мой вопрос: что произойдет, если я добавлю число со знаком и число без знака вместе? Как я могу объяснить переполнение? Буду ли я по умолчанию переполнять результат для подписанного варианта или нет? Я пытаюсь реализовать инструкцию adc
для эмулятора, и это был нюанс, о котором я думал.
Арифметическое переполнение для чисел с разными знаками, сборка 6502
Ответы (1)
Независимо от того, подписано число или нет, это полностью проблема программиста; 6502 не различает поведение в зависимости от намерений программиста.
В этом случае переполнение всегда рассчитывается исходя из предположения, что оба числа подписаны.
Конкретный тест для ADC
: если два входных числа имеют одинаковый знак, а результат имеет другой знак, установить переполнение. В противном случае очистите его.
Это то же самое, что спросить: неверен ли знак результата? Добавление чисел с разными знаками никогда не может привести к переполнению из-за задействованных диапазонов, а добавление чисел с одним и тем же знаком никогда не должно давать числа с другим знаком.
Итак, типичная реализация C-esque может выглядеть так:
overflow = ~(a^operand) & (a^result) & 0x80;
Кстати, именно так вычисляется переполнение даже в десятичном режиме, хотя используется промежуточная версия результата. Это не попытка предоставить полезную информацию, это просто побочный эффект — переполнение ничего не значит в десятичной арифметике.