Forum: Compiler & IDEs Datentypen C zu GCC


von David (Gast)


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.

von user (Gast)


Lesenswert?

ja bei unsigned long solltest du auch UL dranhängen, ist ja C.
uint8_t ist wirklich 8 bit breit. unsigned char ist architekturabhängig, 
meistens 8bit, muss aber nicht

von Markus (Gast)


Lesenswert?

> ich habe zwei kleine Fragen, worin sich C und GCC womöglich
> unterscheiden.

Wo drin unterscheiden sich denn Hammer und Werkzeug?

von David (Gast)


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?

von der mechatroniker (Gast)


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

von der mechatroniker (Gast)


Lesenswert?

Mein letztes Beispiel bezieht sich natürlich auf (uC-) Plattformen, auf 
denen ein int 16 Bit hat.

von Karl H. (kbuchegg)


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.

von Rolf Magnus (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:
> Beachte:
>  40000 ist bei 16-Bit int, mit einem int nicht darstellbar und ist daher
> ein long

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".

von Klaus (Gast)


Lesenswert?

Sind Hex-Zahlen-Konstanten immer erstmal unsigned?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Klaus schrieb:
> Sind Hex-Zahlen-Konstanten immer erstmal unsigned?

Nein, aber dezimale Konstanten sind per definitionem halt immer signed.
Hexadezimale und oktale Konstante dagegen gehen die ganze Palette
durch, also int -> unsigned int -> long -> unsigned long usw.

von Klaus (Gast)


Lesenswert?

Wer hat sich das nur ausgedacht... ;)

von Rolf Magnus (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Klaus schrieb:
> Wer hat sich das nur ausgedacht... ;)

Falsche Frage.
Richtige Frage: Was haben sie damals geraucht und sind Spätfolgen 
aufgetreten :-)

von Rolf Magnus (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> und sind Spätfolgen aufgetreten :-)

Ja, zum Beispiel gerade eben in diesem Forum ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Weil's gerade so schön passt, kann man diesen ja mal wieder aufwärmen:

http://www.gnu.org/fun/jokes/unix-hoax.html

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.