2009-07-23 16 views
63

Widziałem ten typ "bez typów" używany kilka razy, ale nigdy nie widziałem wyjaśnienia tego. Przypuszczam, że istnieje odpowiedni typ signed. Oto przykład:jaki jest niepodpisany typ danych?

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 mam zebrane do tej pory:
- w moim systemie, sizeof(unsigned) = 4 (wskazówki na 32-bitowym unsigned int)
- to może być używane jako skrót do odlewania inny typ do wersji niepodpisanej:

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

Czy to ANSI C, czy tylko rozszerzenie kompilatora?

Odpowiedz

110

unsigned rzeczywiście jest skrótem unsigned int i tak zdefiniowany w standardzie C

23

unsigned oznacza unsigned int. signed oznacza signed int. Używanie tylko unsigned jest leniwym sposobem zadeklarowania unsigned int w C. Tak, to jest ANSI.

6

w C, unsigned to skrót do unsigned int.

Masz takie same dla long że jest skrótem dla long int

I jest to również możliwe, aby zadeklarować unsigned long (będzie to unsigned long int).

To jest w ANSI

+0

Tak. "unsigned" to to samo, co "unsigned int", ale ja przeszukałem _UGG14/N1124 Committee Draft - 6 maja 2005 r. ISO/IEC 9899: TC2_ dla "unsigned" i nie mogłem znaleźć, gdzie jest zdefiniowane ... czy mógłbyś zacytować część, w której jest zdefiniowana? – user454322

11

Historycznie w C, jeśli pominąć typ danych „Int” był zakładany. Tak więc "unsigned" jest skrótem dla "unsigned int". Jest to od dawna uważane za złą praktykę, ale wciąż jest tam sporo kodu, który ją wykorzystuje.

+6

Nie wiedziałem, że to była zła praktyka. Czy istnieje uzasadnienie tego? 'long' zamiast' long int' jest bardzo częste, więc nie jestem pewien, dlaczego 'unsigned' zamiast' unsigned int' nie byłby akceptowalny. –

+10

@Charles Bailey: w dzisiejszych czasach - przynajmniej jeśli jesteś raczej pragmatyczny niż formalny - długi, int, short i char są uważane za różne typy danych, ponieważ mogą mieć różne rozmiary) z niepodpisanym (i domyślnym, podpisanym) kwalifikator. W ten sposób używałbyś "unsigned int" w ten sam sposób, w jaki używałbyś "unsigned long" lub "unsigned char" (i to wyjaśnia, że ​​nie spudłowałeś z int). W int "long int" lub "short int" jest zbędne. – Dipstick

+1

@Dipstick, "long" to kwalifikator dla "int". Wydaje się, że int w "unsigned int" jest tak samo niepotrzebne jak int w "unsigned long int". –

3

w języku C i C++

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

całkowitą bez znaku zawierającego N bitów może mieć wartość od 0 do (2^N-1), który jest o 2^n różnych wartościach.

Liczba całkowita bez znaku jest dodatnia lub zero.

Podpisane liczby całkowite są przechowywane w komputerze za pomocą uzupełnienia 2-go.

0

Przywołanie mojego answer from another question.

Z C specification, sekcja 6.7.2:

- niepodpisane lub unsigned int

znaczy, że unsigned, gdy nie określono typu, są domyślnie unsigned int. Zatem pisanie unsigned a jest takie samo jak unsigned int a.