Я более чем наполовину участвую в обучении, и я знаком с концепцией того, как целые числа с подписью и без знака представлены в битах, я знаю, что может показаться странным вопрос, ответ на который будет довольно очевидным, но Мне интересно, если использование арифметической операции, такой как сложение, имеет смысл для пары чисел, одна из которых считается подписанной, а другая без знака, я думал о нескольких примерах, подобных приведенным ниже, что даст правильный результат:будет делать арифметическую операцию над парой подписанных и неподписанных чисел?
10000001 (1-байтовое целое число без знака, и считать, что эквивалентно 129)
+
11111111 (1-байтовое целое число, и считается подписанным (в дополнительном коде системы), что эквивалентно -1)
10000000 (1-байтовое целое число, а в беззнаковой логике, эквивалентные 128)
Теперь, если верхнее значение было в AL регистр, и мы имели следующий код инструкции (в формате GAS):
addb -1, %al
, тогда флаг переноса (CF) регистра EFLAGS будет установлен после выполнения операции и будет информировать о переполнении, которое на самом деле не произошло, и, возможно, потому, что есть одно беззнаковое число в терминах переполнения флага переполнения (OF) Регистр EFLAGS следует указать. Поэтому я смущен, если делать такую вещь всегда разумно.
Это верно только в том случае, если результат такого же размера, как и все операнды. Обычно процессоры имеют многократные инструкции, размер результата которых в два раза превышает размер операнда; некоторые из них также имеют инструкции добавления, в которых операнды имеют разные размеры (например, как «ADD.W D3, A5» на 68000, так и 'ADD * +' на TMS32050 будут подписывать-расширять 16-битное значение и добавлять его к 32 В TMS также есть «ADDU * +», чтобы добавить 16-разрядное значение без знака в 32-разрядный регистр. – supercat