Знаковость
В вычислительной технике знаковость — это свойство типов данных, представляющих числа в компьютерных программах. Числовая переменная называется знаковой, если она может представлять как положительные, так и отрицательные числа, и беззнаковой, если она может представлять только неотрицательные числа (ноль или положительные числа).
Поскольку знаковые числа могут представлять отрицательные значения, диапазон положительных чисел, который может быть представлен знаковым типом того же размера (в битах), меньше, чем у беззнакового типа: примерно половина возможных значений отводится для неположительных чисел, тогда как соответствующий беззнаковый тип может использовать все возможные значения для диапазона положительных чисел.
Например, дополнительно-кодовый знаковый 16-битный целый тип может принимать значения от −32768 до 32767 включительно, тогда как беззнаковый 16-битный целый тип — значения от 0 до 65535. Для этого метода старший бит (наиболее значимый бит) указывает, является ли значение отрицательным (0 — для положительных чисел и нуля, 1 — для отрицательных)[1].
В языках программирования
Для большинства архитектур на уровне машинного языка различия между знаковыми и беззнаковыми типами нет. Тем не менее, инструкции арифметики обычно устанавливают различные флаги процессора, такие как Флаг переноса для беззнаковой арифметики и Флаг переполнения для знаковой. Эти значения могут учитываться последующими командами перехода или арифметическими операциями.
Язык программирования C, а также его производные (за исключением Java, в котором отсутствуют беззнаковые типы), реализуют знаковость для всех целочисленных типов данных, а также для символьного типа. Для целых чисел модификатор unsigned определяет тип как беззнаковый. По умолчанию вне битовых полей целочисленные типы являются знаковыми, но это можно явно указать с помощью модификатора signed. В то же время стандарт C определяет signed char, unsigned char и char как три различных типа, но требует, чтобы все три имели одинаковый размер и выравнивание. Кроме того, char должен иметь тот же числовой диапазон, что и либо signed char, либо unsigned char, но выбор зависит от платформы. Целочисленные литералы могут быть объявлены беззнаковыми с помощью суффикса U.
Компиляторы часто выдают предупреждение при сравнении знаковых и беззнаковых чисел или при приведении одного типа к другому. Такие операции потенциально опасны, поскольку диапазоны знаковых и беззнаковых типов различаются.
| Бит | Мин. значение | Макс. значение |
|---|---|---|
| 8 (знаковый) | −128 | 127 |
| 16 (знаковый) | −32 768 | 32 767 |
| 32 (знаковый) | −2 147 483 648 | 2 147 483 647 |
| 64 (знаковый) | −9 223 372 036 854 776 000 | 9 223 372 036 854 776 000 |
| 128 (знаковый) | −170 141 183 460 469 230 000 000 000 000 000 000 000 | 170 141 183 460 469 230 000 000 000 000 000 000 000 |
| 8 (беззнаковый) | 0 | 255 |
| 16 (беззнаковый) | 0 | 65 535 |
| 32 (беззнаковый) | 0 | 4 294 967 295 |
| 64 (беззнаковый) | 0 | 18 446 744 073 709 552 000 |
| 128 (беззнаковый) | 0 | 340 282 366 920 938 500 000 000 000 000 000 000 000 |