2016-12-23 3 views
0

Mit folgendem Code:Implizite char Umwandlung

unsigned char c1 = -55; 

1.) Was passiert? Wird die c1 Variable implizit in unsigned int konvertiert oder wird unsigned ignoriert und c1 bleibt signed int?

2.) Warum diese beiden Aussagen:

if (c1 != -55) 
    printf("!="); 

und

if (c1 != 55) 
    printf("!="); 

Druck !=?

+0

Bitte können Sie mir sagen, warum wurde meine Frage abgelehnt? – Mulligun81

+0

Ich habe Sie nicht abgelehnt, aber es ist eine sehr grundlegende Frage mit einigen grundlegenden Verwirrungen darin eingebettet; Sie wären wahrscheinlich besser dran, ein oder mehrere C++ - Lehrbücher zu bearbeiten, bevor Sie hier weitere Fragen stellen. – zwol

Antwort

6
  1. Keine der oben genannten. c1 hat Typ unsigned char; Nichts auf der rechten Seite des Gleichheitszeichens kann das ändern. Der Wert − 55 (die int hat Typ) zu unsigned char durch die Zuweisung umgewandelt wird, als-ob von 256 ihm hinzufügen, so wird c1 auf 201 initialisiert du selbst sehen können, durch das Schreiben

    printf("%u\n", c1); 
    

    nach der Initialisierung.

  2. Beide Vergleiche konvertieren c1zurück zu int zuerst. 201 ist in int darstellbar, also ändert sich der Wert nicht. 201 ist nicht gleich 55, noch ist es gleich − 55.


Technisch hinzugefügt der Wert UCHAR_MAX+1, aber es ist sehr, sehr selten, dass etwas mehr zu sein, aber 256 . Der Effekt der Umwandlung einer negativen Zahl von vorzeichenbehaftet in vorzeichenlos wird im Standard angegeben.

+0

Mehrere Fragen: 1.) Welche Art der Konvertierung erwähnen Sie in der Antwort # 1? (SM, U1, U2)? 2.) In Bezug auf Antwort # 2 - Warum ist die Konvertierung von unsigned char nach int, nicht umgekehrt (von int zu unsigned char)? Wenn das richtig ist, dann deshalb, weil die Conversion immer versucht, eine Promotion zu sein - von einem schmaleren zu einem breiteren Datentyp, um Datenverlust zu vermeiden? – Mulligun81

+0

@ Mulligun81 (1) Ich weiß nicht, was Sie mit SM, U1 oder U2 meinen. (2) Die vollständige Erklärung passt nicht in das Kommentarfeld. Es gibt eine Reihe von [automatischen Konvertierungen] (http://www.eskimo.com/~scs/class/int/sx4cb.html), die immer dann vorkommen, wenn Sie in C arithmetisch vorgehen. Sie erweitern immer die Conversions und die Logik _ist_, um den Wert zu erhalten, wann immer es möglich ist, aber ihr Verhalten kann immer noch überraschend sein, so dass Sie die tatsächlichen Regeln kennen und verstehen müssen. – zwol

Verwandte Themen