unsigned Hex in C

Gast #723661
Lesenswert?

Es gibt keinen Hex-Datentyp in C. Es gibt int in verschiedenen Längen, 
signed und unsigned. Für jeden kannst du Literale angeben. Das ist 
unabhängig davon, ob du für den Wert des Literals die Dezimal- oder 
Hexadezimalschreibweise wählst.

0x0fU ist also dasselbe wie 15U.
Gast #723730
Lesenswert?

Hallo Jan

Sämtliche Daten werden binär abgelegt. Hexadezimal ist nur eine 
abgekürzte Schreibweise davon.

Wenn du irgnedwo in deinem Code einen konstanten Wert angibst, ist das 
eigentlich egal, ob du das in bin, hex oder dec machst. Es kommt nur 
darauf an, wie das Bitmuster von deinem Code interpretiert wird.

Was es mit dem U auf sich hat, kann man wahrschinlich im Code sehen. 
Also solltest du ihn mal posten.

Gruss Olli
Gast #725285
Lesenswert?

Hallo Jan,

vielleicht ist das mit dem signed / unsigned einfach nicht so klar:
die Frage ob eine Variable signed oder unsigned deklariert ist, ändert 
nichts an der Binären Darstellung sondern am Wertebereich, eine Frage 
wie ich eine folge von Bits "interpretiere". Ein Beispiel: Ein Byte: bei 
der unsigned variante reicht der Wertebereich von 0 bis 255 (0000.0000 
bis 1111.1111), bei der signed Variante wird das höchstwertige bit als 
"Vorzeichen" gedeutet. Wir haben einen Wertebereich von -128 bis + 127 
(1000.0000 bis 0111.1111). Eine Zuweisung unsigned char x = 0xffU ist 
eigentlich unsinnig. Ob 0xff als -1 oder 255 verwendet wird hängt von 
der Definition der Zielvariablen aber nicht vom U hinter der 
Hexdarstellung ab. Bestenfalls wird der Compiler meckern, wenn du ein 
0xffU auf ein signed char zuweist.

Gruß
Sebastian
Gast #1572000
Lesenswert?

Was bedeutet eigentlich das hier:

(Uint32)(0x1ul<<x)

Das Typecasting zu einem Unsigned Int mit 32-Bit-Länge versteh ich noch 
(Uint32 wurde vorher definiert). Ich nehme an das "<<x" ist ein 
links-shift um x stellen. Das "u" würde ich als unsigned interpretieren, 
aber warum steht da "ul"?

Anmerkung: das "l" in "ul" ist übrigens ein kleines L, also keine Zahl 
Eins. Lässt sich hier in der Schrift nicht erkennen.
#1572008
Lesenswert?

Michael schrieb:
> Was bedeutet eigentlich das hier:
>
> (Uint32)(0x1ul<<x)
>
> Das Typecasting zu einem Unsigned Int mit 32-Bit-Länge versteh ich noch
> (Uint32 wurde vorher definiert). Ich nehme an das "<<x" ist ein
> links-shift um x stellen. Das "u" würde ich als unsigned interpretieren,
> aber warum steht da "ul"?

das l steht für long.
Das soll wohl verhindern, dass der Shift nur mit einem int gemacht wird, 
was ein Problem wäre, wenn ein int auf dem System nur 16 Bit hat.
Einen 16 Bit int um 18 Stellen nach links geschoben ergibt immer 0
Gast #1573644
Lesenswert?

Nein, das war es nicht. Mir ging es darum: (Zitat aus der ISO-Norm)

"If the value of the right operand is negative or is greater than or
equal to the width of the promoted left operand, the behavior is
undefined."

Mit anderen Worten: Wenn man um die Größe des Typs oder mehr shiftet, 
ist das Verhalten undefiniert, und das ist bei "Einen 16 Bit int um 18 
Stellen nach links geschoben" der Fall.
#1573663
Lesenswert?

Rolf Magnus schrieb:
> Nein, das war es nicht. Mir ging es darum: (Zitat aus der ISO-Norm)
>
> "If the value of the right operand is negative or is greater than or
> equal to the width of the promoted left operand, the behavior is
> undefined."

Ah.
Den kannte ich noch gar nicht :-)

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