Одна и та же последовательность бит может иметь радикально разные значения в зависимости от контекста.
Целочисленные типы имеют фиксированное количество битов - определение языка C требует, чтобы тип int
со знаком должен был представлять не менее диапазон [-32,767...32,767]
, что означает, что int
должно быть не менее 16 бит в ширину 1 .
Существует несколько различных способов представления целых чисел со знаком. Наиболее распространенным является дополнение 2, но некоторые архитектуры могут использовать дополнение 1 или величину знака.
Чтобы отразить знак числа дополнения 2, сделайте побитовое отрицание и добавьте 1 (в этом примере предполагается 8-битные целые числа):
00001101 == 13
11110010 + 1 == 11110011 == -13
11110011 == -13
00001100 + 1 == 00001101 == 13
Одним из главных преимуществ дополнения 2 является то, что у вас есть одно представление для 0, и оно дает вам несколько более широкий диапазон значений - [-2<sup>n-1</sup>..2<sup>n-1</sup>-1]
Чтобы поставить знак на номер дополнения 1, вы просто делаете побитовое отрицание:
00001101 == 13
11110010 == -13
11110010 == -13
00001101 == 13
С дополнением 1 у вас есть положительное и отрицательное представление для 0 - 00000000
и 11111111
- и диапазон составляет [-2<sup>n-1</sup>-1..2<sup>n-1</sup>-1]
При значении знака вы оставляете биты значения как есть и переворачиваете бит знака:
00001101 == 13
10001101 == -13
Как и дополнение 1, вы получаете две кодировки для положительных и отрицательных 0 - 00000000
и 10000000
.
Целочисленные типы без знака имеют ту же ширину, что и их знаковые аналоги, а их диапазон равен [0..2<sup>n</sup>-1]
.
Итак, битовая последовательность 11110011
может означать -13 в дополнении 2, -12 в дополнении 1, -115 в значении знака или 243 без знака.
Обратите внимание, что некоторые архитектуры могут использовать биты заполнения, так что для представления 32 767 требуется более 16 бит.