Forum: PC-Programmierung unsigned Hex in C


von Jan (Gast)


Lesenswert?

Hi,


steht 0x*U für unsigned hex?

hex wird standard als 0x* dargestellt und wenn am Ende noch eine "U" 
steht, bedeutet es dass es sich um unsigned hex handelt oder hat es eine 
andere Bedeutung??

mfg
Jan

von der mechatroniker (Gast)


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.

von Jan (Gast)


Lesenswert?

ja das ist ja klar. Es geht hier nicht um Datentyp, sondern um die 
Schreibweise.

wofür stehr das "u" am Ende von 0x0fU? Stehr es für unsigned hex?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es steht für unsigned.

Nicht für "unsigned hex", nicht für "unsigned decimal" und auch nicht 
für "unsigned bockwurst".

von Jan (Gast)


Lesenswert?

ok aber wenn es 0x*u ist dann steht es für unsigned Hex, weil 0x* Hex 
und +u -> unsigned Hex :-)

und vielen dank für die Hilfe

von Olli (Gast)


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

von Sebastian (Gast)


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

von Michael (Gast)


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.

von Karl H. (kbuchegg)


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

von Michael (Gast)


Lesenswert?

Vielen Dank!

von Rolf Magnus (Gast)


Lesenswert?

> Einen 16 Bit int um 18 Stellen nach links geschoben ergibt immer 0

Es ergibt eigentlich sogar undefiniertes Verhalten.

von ich (Gast)


Lesenswert?

>Es ergibt eigentlich sogar undefiniertes Verhalten.

?? Das erklär mir mal bitte

von Karl H. (kbuchegg)


Lesenswert?

Dinge auf Bitebene, wie zb schieben, sind nur für unsigned Datentypen 
sauber definiert (ich denke mal das ist es worauf Rolf hinauswollte)

von Rolf Magnus (Gast)


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.

von Karl H. (kbuchegg)


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

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.