Zuweisungen



  • Hallo,

    wenn ich ein long mit einem longlong verodere passiert Folgendes:

    LONGLONG long
    0x0200000000000000 | 0xffe30b54 = 0xffffffffffe30b54

    Eigentlich sollte doch 0x02000000ffe30b54 herauskommen?!?

    Meine erste Vermutung war, dass das long automatisch in ein longlong konvertiert wird und er dann irgendwelchen Speicher dafür nimmt der zufällig gefüllt ist.

    Wenn ich aber Folgendes mache:
    LONGLONG long
    0x0000000000000000 | 0x02000000 = 0x0000000002000000

    Dann stimmt das Ergebnis.

    Hat das vielleicht irgendwas damit zu tun dass beides signed-Typen sind?



  • Ja, es hat etwas damit zu tun, daß 'long' signed ist - in 0xFF... gilt das oberste Bit als Vorzeichen und bei der Umwandlung nach 'long long' wird dieses Vorzeichen beibehalten. Die Lösung wäre es, mit vorzeichenlosen Daten zu rechnen (die bekommst du, indem du ein 'u' an die Konstante anhängst: 0xffe30b54u).

    (btw, größere Typen als long gehören nicht zum offiziellen ANSI-Standard)



  • Danke für die Antwort.
    Aber warum füllt er dann alles mit f auf anstatt nur das oberste Bit zu setzen?
    Wenn er es ins 2-komplement umwandeln würde, müsste er ja insgesamt noch 1 addieren
    oder?
    😕


  • Mod

    In Abwesenheit von Suffixen ist der Typ eines hexadezimalen Integerliterals der erste der Typen int,unsigned,long,unsigned long,long long, unsigned long long, der den Wert repräsentieren kann - bei einem normalen 32bit-PC wäre das hier unsigned. Die integrale Konvertierung in long long vor der Ausführung des |-Operators verändert den Wert nicht, da dieser in long long dargestellt werden kann. Mithin ist der Compiler nicht standardkonform (wenn wir die long long-Problematik ignorieren - das würde ich hier nicht ankreiden) oder die Plattform benutzt andere Typgrößen.


Anmelden zum Antworten