что такое беззнаковый тип данных?

93

Я видел, как этот unsigned«бестиповый» тип использовался пару раз, но никогда не видел ему объяснения. Полагаю, есть соответствующий signedтип. Вот пример:

Что я собрал до сих пор:
- в моей системе sizeof(unsigned) = 4(намекает на 32-битное целое число без знака)
- это может использоваться как сокращение для приведения другого типа к неподписанной версии:

Это ANSI C или просто расширение компилятора?

ххааму
источник

Ответы:

147

unsignedдействительно является сокращением unsigned intи определено в стандарте C.

Мартин против Лёвиса
источник
32

unsignedзначит unsigned int. signedзначит signed int. Использование just unsigned- это ленивый способ объявления unsigned intв C. Да, это ANSI.

Полярис878
источник
15

Исторически в C, если вы опускали тип данных, предполагалось "int". Итак, «беззнаковый» - это сокращение от «беззнаковое целое». Долгое время это считалось плохой практикой, но все еще существует довольно много кода, который ее использует.


источник
6
Я не знал, что это плохая практика. Есть ли для этого объяснение? longвместо long intочень распространено, поэтому я не уверен, почему unsignedвместо этого unsigned intбыло бы неприемлемо.
CB Bailey,
10
@Charles Bailey: в наши дни - по крайней мере, если вы ведете себя прагматично, а не формально - long, int, short и char считаются разными типами данных, поскольку они могут быть разных размеров) с unsigned (и по умолчанию, подписанным), являющимся квалификатор. Таким образом, вы склонны использовать «unsigned int» так же, как вы бы использовали «unsigned long» или «unsigned char» (и это дает понять, что вы не просто пропустили int). Int в "long int" или "short int" излишни.
Dipstick
1
@Dipstick, long является квалификатором для int. Похоже, что int в "unsigned int" так же излишне, как и int в "unsigned long int".
Конрад Мейер
1
Это не то же самое, что неявное правило «int». Этот ответ вводит в заблуждение.
8

в C unsigned- это ярлык для unsigned int.

У вас тоже longесть ярлык дляlong int

И также можно объявить a unsigned long(это будет a unsigned long int).

Это в стандарте ANSI

ThibThib
источник
Да. unsignedто же самое, unsigned intно я сделал поиск по WG14 / N1124 комитета проекта - 6 мая 2005 ISO / IEC 9899: TC2 для так unsignedи не смог найти , где определяется ... Вы могли бы процитировать ту часть , где она определяется?
user454322
5

В C и C ++

Целое число без знака, содержащее n битов, может иметь значение от 0 до (2 ^ n-1), что составляет 2 ^ n разных значений.

Целое число без знака может быть положительным или нулевым.

Целые числа со знаком хранятся в компьютере с использованием дополнения до 2.

Рабин Сах
источник
2

Согласно C17 6.7.2 §2:

Каждый список спецификаторов типа должен быть одним из следующих мультимножеств (разделенных запятыми, когда на элемент приходится более одного мультимножества); спецификаторы типа могут появляться в любом порядке, возможно, смешанные с другими спецификаторами объявления

- void
- char
- signed char
- unsigned char
- short, signed short, short int или signed short int
- unsigned short или unsigned short int
- int, signed или signed int
- unsigned или unsigned int
- long, signed long , long int, или signed long int
- unsigned long, или unsigned long int
- long long, signed long long, long long int или signed long long int
- unsigned long long, или unsigned long long int
- float
- double
- long double
- _Bool
- float _Complex
- double _Complex
- long double _Complex
- спецификатор атомарного типа
- спецификатор структуры или объединения
- спецификатор перечисления
- имя typedef

Таким образом , в случае unsigned intмы можем либо писать unsignedили unsigned int, или , если мы чувствуем себя с ума, int unsigned. Последнее, поскольку стандарт достаточно глуп, чтобы разрешить «... могут встречаться в любом порядке, возможно, смешанные». Это известный недостаток языка.

Правильный код C использует unsigned int.

Лундин
источник
1

Приведу свой ответ из другого вопроса .

Из спецификации C , раздел 6.7.2:

- unsigned или unsigned int

Это означает, что unsigned, если не указан тип, по умолчанию будет использоваться unsigned int. Так писать unsigned aто же самое, что и unsigned int a.

Бруно Феррейра
источник