Беззнаковые и знаковые целочисленные
Если вам понятна двоичная система счисления, то с представлением числа в памяти у вас не должно возникнуть проблем. Запишем число 12 в 8-битную переменную (ячейку памяти):
7 бит | 6 бит | 5 бит | 4 бит | 3 бит | 2 бит | 1 бит | 0 бит |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
Записать беззнаковое число очень просто, но как представить отрицательное? Очевидно, можно выделить один из битов под знак, тогда если он равен «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
) действительно равно нулю.