Введение

В вычислительной технике, знаковость — это свойство типов данных, представляющих числа в компьютерных программах. Числовая переменная является знаковой, если она может представлять как положительные, так и отрицательные числа, и беззнаковой, если она может представлять только неотрицательные числа (ноль или положительные числа). Поскольку знаковые числа могут представлять отрицательные числа, они теряют диапазон положительных чисел, которые могут быть представлены только беззнаковыми числами того же размера (в битах), так как примерно половина возможных значений является неположительными, в то время как соответствующий беззнаковый тип может использовать все возможные значения для диапазона положительных чисел. Например, 16-битное целое число со знаком, представленное в дополнительном коде, может хранить значения от −32768 до 32767 включительно, а 16-битное беззнаковое целое число — от 0 до 65535. В этом методе представления знака самый левый бит (старший бит) указывает, является ли значение отрицательным (0 для положительного или нуля, 1 для отрицательного).

В языках программирования

Для большинства архитектур в машинном коде отсутствует различие между знаковыми и беззнаковыми типами. Тем не менее, арифметические инструкции обычно устанавливают различные флаги процессора, такие как флаг переноса для беззнаковой арифметики и флаг переполнения для знаковой. Эти значения могут учитываться последующими командами ветвления или арифметическими операциями. Язык программирования C и его производные реализуют знаковость для всех целочисленных типов данных, а также для "символов". Для целых чисел модификатор `unsigned` определяет тип как беззнаковый. По умолчанию целочисленная знаковость – знаковая, но может быть явно установлена с помощью модификатора `signed`. В отличие от этого, стандарт C объявляет `char`, `short` и `int` как три различных типа, но указывает, что все три должны иметь одинаковый размер и выравнивание. Более того, `char` должен иметь тот же числовой диапазон, что и `short` или `int`, но выбор конкретного типа зависит от платформы. Целочисленные литералы могут быть сделаны беззнаковыми с помощью суффикса `U`. Компиляторы часто выдают предупреждение при сравнении знаковых и беззнаковых чисел или при приведении одного типа к другому. Это потенциально опасные операции, поскольку диапазоны знаковых и беззнаковых типов различаются.