що таке непідписаний тип даних?


91

Я бачив 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-розрядний непідписаний int)
- це може бути використано як скорочення для передачі іншого типу до непідписаної версії:

signed long int i = -42;
printf("%u\n", (unsigned)i);

Це ANSI C, чи просто розширення компілятора?

Відповіді:



30

unsignedзасоби unsigned int. signedзасоби signed int. Використання справедливого unsigned- це лінивий спосіб оголосити unsigned intв C. Так, це ANSI.


14

Історично в C, якщо ви пропустили тип даних, передбачалося "int". Тож "unsigned" - це скорочення для "unsigned 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" зайвий.
щуп

1
@Dipstick, "long" - це ознака для "int". Здається, що int у "unsigned int" так само зайвий, як int у "unsigned long int".
Conrad Meyer

1
Це не те саме, що імпліцитне правило "int". Ця відповідь оманлива.

7

в C unsigned- це ярлик для unsigned int.

У вас є те саме, longщо це ярлик дляlong int

І також можна оголосити a unsigned long(це буде a unsigned long int).

Це відповідає стандарту ANSI


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

5

У C та C ++

unsigned = unsigned int (Integer type)
signed   = signed int (Integer type)

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

Ціле число без знака є або позитивним, або нульовим.

Підписані цілі числа зберігаються в комп'ютері за допомогою доповнення 2.


2

Відповідно до C17 6.7.2 §2:

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

- void
- char
- підписав char
- unsigned char
- короткий, підписав короткий, короткий int, або підписав short int
- не підписав короткий, або не підписав короткий int
- int, підписав або підписав int
- не підписав, або не підписав int
- довгий, підписав довгий , long int, або підпис long int
- без підпису long, або unsigned long int
- long long, підпис long long, long long int, або підпис 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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.