jaki jest niepodpisany typ danych?

90

Widziałem ten unsigned„bez typu” typ używany kilka razy, ale nigdy nie widziałem jego wyjaśnienia. Przypuszczam, że istnieje odpowiedni signedtyp. Oto przykład:

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;
}

Co zebrałem do tej pory:
- w moim systemie, sizeof(unsigned) = 4(wskazówka na 32-bitowy int bez znaku)
- może być użyty jako skrót do rzutowania innego typu na wersję bez znaku:

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

Czy to ANSI C, czy tylko rozszerzenie kompilatora?

hhaamu
źródło

Odpowiedzi:

144

unsignednaprawdę jest skrótem unsigned inti tak zdefiniowanym w standardzie C.

Martin przeciwko Löwis
źródło
30

unsignedznaczy unsigned int. signedznaczy signed int. Używanie just unsignedto leniwy sposób zadeklarowania unsigned intw C. Tak, to jest ANSI.

Polaris878
źródło
14

Historycznie w C, jeśli pominięto typ danych, zakładano „int”. Tak więc „unsigned” jest skrótem od „unsigned int”. Przez długi czas było to uważane za złą praktykę, ale wciąż istnieje spora ilość kodu, który z niej korzysta.


źródło
6
Nie zdawałem sobie sprawy, że to zła praktyka. Czy jest to uzasadnione? longzamiast long intjest bardzo powszechne, więc nie jestem pewien, dlaczego unsignedzamiast tego unsigned intbyłoby to nie do przyjęcia.
CB Bailey,
10
@Charles Bailey: w dzisiejszych czasach - przynajmniej jeśli jesteś pragmatyczny, a nie formalny - long, int, short i char są uważane za różne typy danych, ponieważ mogą mieć różne rozmiary), a unsigned (i domyślny, podpisany) jest kwalifikator. W związku z tym miałbyś tendencję do używania „unsigned int” w ten sam sposób, w jaki używałbyś „unsigned long” lub „unsigned char” (i to jasno pokazuje, że nie przegapiłeś po prostu int). Int w „long int” lub „short int” jest zbędne.
Dipstick
1
@Dipstick, „long” jest kwalifikatorem „int”. Wygląda na to, że int w „unsigned int” jest tak samo zbędny jak int w „unsigned long int”.
Conrad Meyer,
1
To nie to samo, co niejawna reguła „int”. Ta odpowiedź jest myląca.
7

w C unsignedjest skrótem do unsigned int.

Masz to samo, longponieważ jest to skrót dolong int

Możliwe jest również zadeklarowanie unsigned long(będzie to a unsigned long int).

Jest to zgodne ze standardem ANSI

ThibThib
źródło
Tak. unsignedjest taki sam, jak, unsigned intale przeszukałem projekt komitetu WG14 / N1124 - 6 maja 2005 r. ISO / IEC 9899: TC2 dla unsignedi nie mogłem znaleźć, gdzie jest zdefiniowane ... czy mógłbyś zacytować część, w której jest zdefiniowana?
user454322
5

W C i C ++

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

Liczba całkowita bez znaku zawierająca n bitów może mieć wartość od 0 do (2 ^ n-1), czyli 2 ^ n różnych wartości.

Liczba całkowita bez znaku jest dodatnia lub zero.

Podpisane liczby całkowite są przechowywane w komputerze przy użyciu uzupełnienia do 2.

Rabin Sah
źródło
2

Zgodnie z C17 6.7.2 §2:

Każda lista specyfikatorów typu powinna być jednym z następujących multizestawów (rozdzielonych przecinkami, gdy na pozycję przypada więcej niż jeden zestaw multizestawowy); specyfikatory typu mogą występować w dowolnej kolejności, być może wymieszane z innymi specyfikatorami deklaracji

- void
- char
- signed char
- unsigned char
- short, signed short, short int lub signed short int
- unsigned short lub unsigned short int
- int, signed lub signed int
- unsigned lub unsigned int
- long, signed long , long int, lub signed long int
- unsigned long lub unsigned long int
- long long, signed long long, long long int, lub signed long long int
- unsigned long long lub unsigned long long int
- float
- double
- long double double
- _Bool
- float _Complex
- double _Complex
- long double _Complex
- specyfikator typu atomowego
- specyfikator struktury lub unii
- specyfikator wyliczenia
- nazwa typu

Tak więc w przypadku unsigned intmożemy albo napisać unsignedlub unsigned int, czy czujemy się szalony int unsigned. Ten ostatni, ponieważ standard jest na tyle głupi, że dopuszcza „… może wystąpić w dowolnej kolejności, ewentualnie zmieszany”. To znana wada języka.

Odpowiednie kod C zastosowania unsigned int.

Lundin
źródło
1

Sprowadzając odpowiedź z innego pytania .

Ze specyfikacji C , sekcja 6.7.2:

- unsigned lub unsigned int

Oznacza to unsigned, że jeśli nie określono typu, domyślnie unsigned int. Więc pisanie unsigned ajest tym samym, co unsigned int a.

Bruno Ferreira
źródło