2016-11-11 1 views
-1

ich den unten Code in Cder Ausgang dieses einfachen c Programm ist hart

geschrieben habe, zu verstehen
#include <stdio.h> 

int main() 
{ 
    char c; 
    c=400; 
    printf("%d",c); 
} 

die Ausgabe -112. Warum? Wenn ich nicht signiertes Char verwendet habe, wird die Ausgabe 144 sein. Warum?

+2

Zuerst sagen, was hat dir dein C-Buch über die Reichweite eines 'Char'-Typs erzählt? –

+1

heißt es, dass es 8 Bits sind. – delsa

+1

@delsa Bereich ist eine Sache und Größe ist eine andere Sache. – Michi

Antwort

0

Der Typ der Ganzzahlkonstanten ist int, und wenn sie dem Typ char zugewiesen ist, wird sie in einer implementierungsdefinierten Weise konvertiert.

Eine Implementierung, die Ihr Ergebnis erfüllt, funktioniert konzeptionell wie folgt: Addieren oder subtrahieren Sie den Bereich des Typs (in diesem Fall 256) vom Wert, bis der Wert vom Typ dargestellt werden kann.

Bereich von Char in diesem Fall ist: [-128,127] und 400 ist nicht darstellbar durch den Typ char.

Subtrahieren 256, und das Ergebnis 144 ist immer noch nicht darstellbar.

Subtrahieren Sie erneut und das Ergebnis -112 ist darstellbar.

+1

Ich würde gerne lesen, konstruktive Kommentare zusammen mit downvotes auf eine richtige Antwort. – 2501

+1

Auch missbrauchen Sie nicht das System und runter, wenn Sie die Antwort nicht mögen oder wenn Sie denken, dass die Frage geschlossen werden sollte. Bei der ersten können Sie über die Frage selbst abstimmen, bei letzterer können Sie abstimmen oder um zu schließen. – 2501

2

Vielen Dank an alle Benutzer.

von dem, was ich in den Kommentaren gesehen habe, erreichte ich diese Schlussfolgerung, die alle Diskussionen beenden wird. gibt es 3 verschiedene Möglichkeiten, signierte Typen zu repräsentieren.

  1. unterzeichnet Größe
  2. 1-Komplement
  3. 2-Komplement

und in all diesen Darstellungen, wenn das höchstwertige Bit 1 ist, dann ist die Zahl negativ ist, und wenn es 0 ist, dann die Anzahl ist positiv. Daher verwendet mein Computer in dieser Frage das Zweierkomplement. Als Ergebnis ist 10010000 eine Darstellung in Zweierkomplement. Sein Wert ist gleich dem Negativ von 01110000 = 112, also ist das wirkliche Ergebnis -112.

Wenn der Typ jedoch nicht vorzeichenbehaftet ist, muss der Wert 400 in binäre Darstellung umgewandelt werden, aber nur Platz für 8 Ziffern. Daher ist die Darstellung 1001 0000 und da dies nicht vorzeichenbehaftet ist, ist es gleich 2^7 + 2^4 = 144.

+1

Bitte beachten Sie, dass in der realen Welt außerhalb des C-Standards, Zeichen & Magnitude und 1-Komplement Unsinn ist. Jede einzelne CPU, die in Volumes produziert wird, verwendet das Zweierkomplement. Sie brauchen sich also keine Sorgen um die anderen beiden zu machen, sie sind ein künstliches Anliegen, das kaum außerhalb von nerdigen C-Standard-Debatten existiert. Konzentriere dich darauf, das Zweierkomplement zu lernen und zu verstehen. – Lundin

Verwandte Themen