В вычислительной технике знаковость — это свойство типов данных, представляющих числа в компьютерных программах. Числовая переменная имеет знак , если она может представлять как положительные , так и отрицательные числа, и не имеет знака, если она может представлять только неотрицательные числа (ноль или положительные числа).
Поскольку числа со знаком могут представлять отрицательные числа, они теряют диапазон положительных чисел, которые могут быть представлены только беззнаковыми числами того же размера (в битах), поскольку примерно половина возможных значений являются неположительными значениями, тогда как соответствующий беззнаковый тип может отнести все возможные значения к диапазону положительных чисел.
Например, 16-битное целое число со знаком в формате дополнения до двух может содержать значения от −32768 до 32767 включительно, в то время как 16-битное целое число без знака может содержать значения от 0 до 65535. Для этого метода представления знака самый левый бит ( старший значащий бит ) обозначает, является ли значение отрицательным (0 для положительного или нулевого, 1 для отрицательного).
Для большинства архитектур в машинном языке нет различия между знаковыми и беззнаковыми типами . Тем не менее, арифметические инструкции обычно устанавливают различные флаги ЦП , такие как флаг переноса для беззнаковой арифметики и флаг переполнения для знаковой. Эти значения могут учитываться последующими командами ветвления или арифметики.
Язык программирования C , вместе с его производными, реализует знаковость для всех целочисленных типов данных , а также для "character" . Для целых чисел модификатор unsigned определяет тип как беззнаковый. Целочисленная знаковость по умолчанию вне битовых полей является знаковой, но может быть установлена явно с помощью модификатора signed . Напротив, стандарт C объявляет signed char , unsigned char и char тремя различными типами, но указывает, что все три должны иметь одинаковый размер и выравнивание. Кроме того, char должен иметь тот же числовой диапазон, что и signed char или unsigned char , но выбор которого зависит от платформы. Целочисленные литералы можно сделать беззнаковыми с помощью суффикса U.
Компиляторы часто выдают предупреждение, когда производятся сравнения между знаковыми и беззнаковыми числами или когда одно приводится к другому. Это потенциально опасные операции, поскольку диапазоны знаковых и беззнаковых типов различны.