Беззнаковые и знаковые целочисленные

Если вам понятна двоичная система счисления, то с представлением числа в памяти у вас не должно возникнуть проблем. Запишем число 12 в 8-битную переменную (ячейку памяти):

7 бит6 бит5 бит4 бит3 бит2 бит1 бит0 бит
00001100

Записать беззнаковое число очень просто, но как представить отрицательное? Очевидно, можно выделить один из битов под знак, тогда если он равен «1», то число отрицательное, а если равен «0», то положительное.

-5 == 0b 1000 0101
 5 == 0b 0000 0101

Такая запись, также называемая «прямым кодом» (sign and magnitude), понятна для человека, но неудобна для вычислений. Постарайтесь самостоятельно подумать, как можно организовать процесс сложения и вычитания таких чисел.

Чаще всего для представления знаковых чисел используют «дополнительный код» (англ. two’s component). Такой способ записи позволяет заменить операцию вычитания на операцию сложения, а значит, упростить реализацию ядра микропроцессора.

В таком случае положительные числа представляются так же, как и беззнаковые, за тем исключением, что MSB-бит (левый) отводится под знак («0» = положительное число). Если число отрицательное, то прямой код инвертируется, т.е. нули превращаются в единицы и наоборот. Затем к этому числу добавляется 1.

0000 0101 // 5
1111 1010 // inversion of 5
1111 1011 // +1
// сложение
0000 0101
+ 1111 1011
____________
1 0000 0000  => 0000 0000 => 0

При выходе за пределы разрядности единица отбрасывается. То есть 5 плюс (-5) действительно равно нулю.


Изменено: