www.mikrocontroller.net

Forum: Compiler & IDEs Datentypen C zu GCC


Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
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.

Autor: user (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

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

Wo drin unterscheiden sich denn Hammer und Werkzeug?

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
unsigned long dings = 10 * 30000; // gibt nicht (!) 300000

Autor: der mechatroniker (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint32_t  beispiel = UINT32_C(1000000);

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind Hex-Zahlen-Konstanten immer erstmal unsigned?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer hat sich das nur ausgedacht... ;)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
long x = -0x9c40;
dann steht da nachher nicht etwa -40000 in x.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Wer hat sich das nur ausgedacht... ;)

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> und sind Spätfolgen aufgetreten :-)

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.