Datentypen C zu GCC

Gast #1607958
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 #1607968
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
Gast #1608007
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
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
> 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
> 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);
Moderator Persönliche Seite #1608916
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".
Gast #1609055
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.