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?

Odpowiedzi:



30

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


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.


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


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.


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.