2012-08-02 20 views
20

Ich frage mich, was ist der Unterschied zwischen uint32_t und uint32, und wenn ich in den Header-Dateien sah es dies hatte:Unterschied zwischen verschiedenen Integer-Typen

types.h: 

    /** @brief 32-bit unsigned integer. */ 
    typedef unsigned int uint32; 
stdint.h: 

    typedef unsigned uint32_t; 

Diese führt nur zu mehr Fragen: Was ist der Differenz zwischen

unsigned varName; 

und

unsigned int varName; 

?

I MinGW.

+8

Sie sind gleich. Allerdings ist der Typ 'uint32' (und der Header '' oder die Datei '" types.h "') nicht durch den C99-Standard definiert. Wenn Sie einen dieser Typen verwenden möchten, verwenden Sie 'uint32_t' und fügen Sie den Header' 'ein. Auch "unsigned" und "unsigned int" sind gleich. – pmg

+1

Also uint32 und sind nicht Teil des Standards, aber uint32_t ist? – user1507133

+2

@ user1507133: Ja. Grundsätzlich gibt es weder in C noch in C++ "uint32". – AnT

Antwort

19

unsigned und unsigned int sind synonym, ähnlich wie [unsigned] short [int] und [unsigned] long [int].

uint32_t ist ein Typ, der (optional) durch den C-Standard definiert ist. uint32 ist nur ein Name, den Sie erfunden haben, obwohl es zufällig als das Gleiche definiert ist.

+8

Ein bisschen Nekromantie hier, aber der Vergleich von 'unsigned [int]' mit '[unsigned] (kurz | lang) [int]' könnte neuen Programmierern den falschen Eindruck geben 'short' und' long' sind standardmäßig vorzeichenlos. Ich würde stattdessen 'unsigned (kurz | lang) [int]' vorschlagen. – bcrist

2

Es bin mit absolut keinen Unterschied zwischen unsigned und unsigned int.

Ob dieser Typ eine gute Übereinstimmung für uint32_t ist, ist jedoch implementierungsabhängig; ein int könnte "kürzer" als 32 Bits sein.

5

Es gibt keinen Unterschied.

unsigned int = uint32 = uint32_t = unsigned in Ihrem Fall und unsigned int = unsigned immer

+2

'unsigned int' ==' unsigned', aber es ist in keiner Weise garantiert, dass 'uint32_t' ==' unsigned int'. 'unsigned int' kann Bitbreiten ab 16 Bit haben. – AnT

+0

In einer Umgebung * mit diesen bestimmten typedefs * ist 'uint32_t' per Definition' unsigned int'. –

+3

@AndreyT: Deshalb habe ich "in Ihrem Fall" geschrieben – RiaD

1

unsigned und unsigned int sind auch aus historischen Gründen; sie bedeuten beide "vorzeichenlose ganze Zahl der natürlichsten Größe für die CPU-Architektur/Plattform", was oft (aber keineswegs immer) 32 Bits auf modernen Plattformen ist.

<stdint.h> ist eine Standardkopfzeile in C99, die Typdefinitionen für ganze Zahlen bestimmter Größen mit der Namenskonvention uint32_t geben soll.

Die <types.h>, die Sie betrachten, scheint nicht standardmäßig zu sein und gehört vermutlich zu einem Framework, das Ihr Projekt verwendet. Sein uint32 typedef ist kompatibel mit uint32_t. Ob Sie das eine oder das andere in Ihrem Code verwenden sollten, ist eine Frage an Ihren Vorgesetzten.

+0

" ist ein Standard-Header in C99". Was ist mit C++ 98 und C++ 11? – user1507133

+0

'' ist, denke ich, der äquivalente C++ - Standard-Header. –

+1

@ user1507133 - C++ 11 hat , die diese Typen in den Namespace 'std' bringt (z. B.' std :: uint32_t'). C++ 98 hat diesen Header nicht, da er C99 vorausgeht. POSIX stellt 'inttypes.h' mit den gleichen Typen zur Verfügung, wenn das gut genug ist. – Nemo

Verwandte Themen