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


Я видел этот unsigned "типизации" тип использовал пару раз, но ни разу не видел объяснения. Я полагаю, что есть соответствующий signed тип. Вот пример:

static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
    next = seed;
}

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

signed long int i = -42;
printf("%un", (unsigned)i);

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

7 74

7 ответов:

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

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

исторически в C, если вы пропустили тип данных "int" был принят. Так что "неподписанные" является сокращением для "беззнаковый инт". Это долгое время считалось плохой практикой, но все еще существует достаточное количество кода, который его использует.

в C,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, Если не указан тип, по умолчанию должно быть unsigned int. Так пишу unsigned a это то же самое, что unsigned int a.

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

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

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

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

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