2012-06-05 2 views
5

Дополнения Two предназначены для упрощения вычисления компьютером двух цифр. Но как компьютер отличает целое число - целое число целых или без знака? Это всего лишь 0 и 1 в памяти.Как компьютер распознает целое число, подписанное или неподписанное?

Для exmaple 1111 1111 в памяти компьютера может представлять собой номер 255, но также может представлять -1.

+0

см. Http://en.wikipedia.org/wiki/Signedness и http://en.wikipedia.org/wiki/Signed_number_representations – mtijn

+0

Я не спрашиваю, как подписанное число, представленное на компьютере – viperchaos

+0

, вы прочитали ссылки? они были опубликованы, потому что они имеют отношение к вашему вопросу. – mtijn

ответ

10

Подписанные и неподписанные данные используют одни и те же данные, но разные инструкции.

В компьютере хранятся подписанные и беззнаковые целые числа как одни и те же данные. То есть 255 и -1 - одни и те же биты. Однако вы сообщаете компилятору, какой тип переменной имеет. Если он подписан, компилятор использует подписанные операторы для управления переменными (например, IDIV), а при отсутствии знака использует другую команду (например, DIV). Таким образом, компилятор создает программу, которая сообщает процессору, как интерпретировать данные.

+1

Стоит отметить, что на большинстве процессоров команда отличается только в случае умножения (MUL/IMUL для IA32) и деления (DIV/IDIV) ([инструкция) [http: //www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html)). Отличная вещь о дополнении 2 на самом деле не так, что ее легче вычесть, но это дополнение (ADD) не волнует, подписаны ли цифры или нет. Из-за этого вычитание действительно проще, так как для вычитания можно легко вычислить дополнение 2 к вычитанию и добавить его в minuend. –

2

Он не различает их. Но с дополнением, вычисление тем же:

Ниже d будет добавляться к десятичным числам, и b в двоичные числа. Вычисления будут содержать 8 битов.

-1d + 1d = 1111 1111b + 1b = 1 0000 0000b

Но так как мы переполнена (да, это 8 0 s и 1 на через 8 бит чисел), то результат будет равен 0.

-2d + 1d = 1111 1110b + 1b = 1111 1111b = -1d

-1d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

-1d + -1d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = -2d

А если рассматривать эти операции на неподписанных (двоичные значения будут неизменными):

255d + 1d = 1111 1111b + 1b = 1 0000 0000b (this overflows) = 0d

254d + 1d = 1111 1110b + 1b = 1111 1111b = 255d

255d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

255d + 255d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = 2d

Unsigned против подписал, таким образом, просто визуальное представление без знака, используется только при отображении человеку :-)

Смежные вопросы