Datentypen C zu GCC

Gast #1607958
Lesenswert?

Guten Tag zusammen,

ich habe zwei kleine Fragen, worin sich C und GCC womöglich 
unterscheiden.
Wenn ich eine unsigned long variable in C initialisiere, so stelle ich 
dem Wert UL hinten an, z.B.
1
unsigned long beispiel = 1000000UL;

Muss ich dieses U für unsigned und L für long auch bei GCC anstellen? In 
vielen Beispielen habe ich dies nämlich nicht entdeckt...

Worin besteht der unterschied zwischen u_int8_t und einem unsigned char? 
Meines erachtens ist das doch gleich. Wieso wird hier häufig dann 
u_int8_t verwendet?

Danke.
Gast #1608007
Lesenswert?

user schrieb:
> ja bei unsigned long solltest du auch UL dranhängen, ist ja C.

angenommen ich verwende uint32_t als Datentyp. Muss ich dennoch dann UL 
anhängen oder ist das durch diese Definition hinfällig?
Gast #1608026
Lesenswert?

Bei einer einfachen Zuweisung ists eh wurscht. Für die Konstante nimmt 
der Compiler einen Datentyp, in dem er die jeweilige Konstante 
darstellen kann, und vor der Zuweisung in die Variable wird (implizit) 
in deren Typ gecastet werden.

Einen Unterschied macht das "UL" eigentlich nur, wenn man rechnet, wie
1
unsigned long dings = 10 * 30000; // gibt nicht (!) 300000
#1608035
Lesenswert?

> Muss ich dieses U für unsigned und L für long auch bei
> GCC anstellen? In vielen Beispielen habe ich dies nämlich
> nicht entdeckt...

Das liegt an den C Regeln.

Die besagen:
Eine Konstante, wie zb 1000000, ist zuallererst einmal ein int (solange 
kein Buchstabe dahinter etwas anderes vorschreibt). Es sei denn, die 
Konstante ist mit int nicht darstellbar, was zb bei 16-Bit int hier der 
Fall ist. In diesem Fall muss der Compiler selbsttätig den nächst 
größeren Datentyp benutzen. In diesem Fall long. Und da 1000000 mit 
einem 32-Bit long darstellbar ist, ist das dann auch der Datentyp, den 
die Konstante implizit zugewiesen bekommt.

Beachte:
 40000 ist bei 16-Bit int, mit einem int nicht darstellbar und ist daher 
ein long

 40000U hingegen ist ein 16-Bit unsigned int.
Gast #1608080
Lesenswert?

> angenommen ich verwende uint32_t als Datentyp. Muss ich dennoch dann UL
> anhängen oder ist das durch diese Definition hinfällig?

Für die Typen aus stdint.h gibt es Makros, die das gleiche tun wie ein 
UL
für unsigned long. Für uint32_t könntest du schreiben:
1
uint32_t  beispiel = UINT32_C(1000000);
Gast #1609055
Lesenswert?

Jörg Wunsch schrieb:
> Und um die Verwirrung weiter zu treiben: 0x9c40 ist zwar zahlenmäßig
> der gleiche Wert wie 40000, ist aber auch auf einer Plattform mit
> 16-bit-"int" vom Typ "unsigned int".

Lustig wird's aber erst bei -0x9c40. Das ist nämlich auch vom Typ 
unsigned int. Wenn man dann schreibt:
1
long x = -0x9c40;
dann steht da nachher nicht etwa -40000 in x.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren