Die Art und Weise, wie C # negative Ganzzahlen im Speicher darstellt und sie deaktiviert

8

C # hat verschiedene Werttypen, und jeder erfüllt seinen eigenen Zweck. Int32 reicht von - (0x7FFFFFFF + 1) bis 0x7FFFFFFF, und von jedem Rechner, auf dem ich es jemals ausgeführt habe, scheint mir unchecked ((int) 0xFFFFFFFF) immer den resultierenden Wert -1 zu haben. Ist das immer so? Stellt .NET außerdem immer -1 als 0xFFFFFFFF im Speicher eines Systems dar? Ist das führende Bit immer das Vorzeichenbit? Verwendet es immer die Zweierkomplement-Binärdarstellung für ganze Zahlen?

    
Alexandru 28.05.2015, 03:39
quelle

2 Antworten

8

Die Dokumentation für System.Int32 explizit gibt an, dass es in zwei Komplementform gespeichert ist. Es ist ganz unten:

  

Neben der Arbeit mit einzelnen ganzen Zahlen als Dezimalwerte, Sie   Möglicherweise möchten Sie bitweise Operationen mit ganzzahligen Werten ausführen oder arbeiten   mit den binären oder hexadezimalen Darstellungen von ganzzahligen Werten.   Int32-Werte werden in 31 Bits mit dem zweiunddreißigsten Bit dargestellt   verwendet als ein Vorzeichenbit. Positive Werte werden durch Verwendung dargestellt   Zeichen-und-Betrags-Darstellung. Negative Werte sind in zwei   Komplement-Darstellung. Dies ist wichtig zu beachten, wenn Sie   Führen Sie bitweise Operationen an Int32-Werten oder bei der Arbeit mit   einzelne Bits. Um einen numerischen, Booleschen oder Vergleich durchzuführen   Operation für beliebige zwei nicht-dezimal Werte, beide Werte müssen das gleiche verwenden   Darstellung.

So scheint es, dass die Antwort auf alle Ihre Fragen ja ist.

Auch der Bereich für ein Int32 ist von - (0x80000000) bis 0x7FFFFFFFF.

    
shf301 28.05.2015, 04:00
quelle
2

C # - wie auch fast jeder andere Computer auf dem Planeten - repräsentiert ganze Zahlen in Zweierkomplement-Notation. Ich glaube, dass irgendwann CPUs entwickelt wurden, die andere Repräsentationen verwendeten, aber heutzutage kann man ziemlich zuverlässig davon abhängen, dass ganze Zahlen in Zweierkomplement-Notation dargestellt werden.

  • Wir zählen die Bits von rechts nach links, mit dem Bit ganz rechts, wobei Bit 0 das niedrigstwertige Bit und das Bit ganz links das signifikanteste Bit ist.

  • Das höchstwertige Bit (ganz links) ist das Vorzeichen: 0 ist positiv; 1 ist negativ.

  • Die restlichen Bits tragen den Wert. Das heißt, die gültige Domäne einer ganzen Zahl von N Bits der Größe ist - (2 ) <= x <= + (2 -1) . Das heißt, eine weitere negative Zahl kann dargestellt werden, als positive Zahlen sein können: Für eine 16-Bit-Ganzzahl mit Vorzeichen beträgt die Domäne -32.768 bis +32.767.

Eine Zahl in Zweier-Komplement zu setzen ist einfach:

  • konvertiert seinen absoluten Wert in binäre / base-2 Notation.
  • wenn der Wert negativ ist,
    • invertiere die Bits
    • addiere 1

Also wird der Wert +1 als 0x0001 dargestellt, während -1 als

dargestellt wird
  • 0x0001 (absoluter Wert von 1 in binär)
  • 0xFFFE (invertierte Bits)
  • 0xFFFF (1 hinzufügen)

Oder 0xFFFF

Der Grund für die Zweierkomplement-Notation ist, dass es das CPU-Design einfacher macht: Da die Subtraktion die Addition des Negativs ist (zB 3-2 ist gleich 3 + -2), müssen sie keine Subtraktionsschaltungen entwerfen:

  • 1-1 ist das gleiche wie 1 + -1 und ergibt null.

  • oder in hex,

    %Vor%

Bei den meisten CPUs setzt der Übertrag in oder aus dem höherwertigen Bit das Fixpunkt-Überlaufflag.

    
Nicholas Carey 28.05.2015 04:50
quelle

Tags und Links