что такое неподписанный тип данных?
Вопрос
Я видел это unsigned
"безтипный" тип использовался пару раз, но никогда не видел объяснения этому.Я полагаю, что существует соответствующий signed
Тип.Вот пример:
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((без подписи)(next/65536) % 32768);
}
void mysrand(неподписанное начальное число) {
next = seed;
}
То, что я собрал на данный момент:
- в моей системе, sizeof(unsigned) = 4
(намекает на 32-разрядный unsigned int)
- это может быть использовано в качестве сокращения для приведения другого типа к неподписанной версии:
signed long int i = -42;
printf("%u\n", (unsigned)i);
Это ANSI C или просто расширение компилятора?
Решение
unsigned
на самом деле это сокращение от unsigned int
, и так определено в стандарте C.
Другие советы
unsigned
означает unsigned int
. signed
означает signed int
.Используя просто unsigned
это ленивый способ объявления unsigned int
в С.Да, это ANSI.
Исторически в C, если вы опустили тип данных, предполагался «int».Таким образом, «unsigned» — это сокращение от «unsigned int».Долгое время это считалось плохой практикой, но до сих пор существует достаточное количество кода, который ее использует.
в С, unsigned
это ярлык для unsigned int
.
У тебя то же самое для long
это ярлык для long int
А еще можно объявить unsigned long
(Это будет unsigned long int
).
Это стандарт ANSI
На C и C ++
unsigned = unsigned int (Integer type)
signed = signed int (Integer type)
Целое число без знака, содержащее n битов, может иметь значение от 0 до (2 ^ n-1), что составляет 2 ^ n разных значений.
Целое число без знака является либо положительным, либо нулевым.
Целые числа со знаком хранятся в компьютере с использованием дополнения 2.
Приношу мой ответ на другой вопрос.
Из Спецификация C, раздел 6.7.2:
— беззнаковое или беззнаковое целое число
Означающий, что unsigned
, если не указан тип, по умолчанию будет unsigned int
.Итак, пишу unsigned a
такой же как unsigned int a
.
Согласно C17 6.7.2 §2:
Каждый список спецификаторов типа должен представлять собой один из следующих мультинаборов (разделенных запятыми, если на элемент имеется более одного мультинабора);спецификаторы типа могут встречаться в любом порядке, возможно, вперемешку с другими спецификаторами объявлений.
- пустота
— чар
— подписал персонаж
— беззнаковый символ
— короткое, короткое со знаком, короткое целое или короткое целое со знаком
— unsigned short или unsigned short int
— int, подписанный или подписанный int
— беззнаковое или беззнаковое целое число
— длинный, длинный со знаком, длинный int или длинный 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
- плавать
- двойной
— длинный дубль
— _Бул
— плавающий _Complex
— двойной _Комплекс
— длинный двойной _Complex
— спецификатор атомарного типа
— спецификатор структуры или объединения
— спецификатор перечисления
— имя определения типа
Так что в случае unsigned int
мы можем либо написать unsigned
или unsigned int
, или если мы чувствуем себя сумасшедшими, int unsigned
.Последнее, поскольку стандарт достаточно глуп, чтобы разрешить «...может происходить в любом порядке, возможно, вперемешку».Это известный недостаток языка.
Правильный код C использует unsigned int
.