Frage

gefunden Heute habe ich folgendes:

#include <stdio.h>

int main(){
char x = 255;
int z = ((int)x)*2;

printf("%d\n", z); //prints -2

return 0;

}

Also im Grunde ich bin immer einen Überlauf, da die Größenbegrenzung durch die Operanden auf der rechten Seite des Gleichheitszeichens ??

bestimmt wird

Warum vor Multiplikation Arbeit in int nicht, es Gießen?

In diesem Fall ich bin mit einem char und int, aber wenn ich „lang“ und „long long int“ (c99), dann habe ich ein ähnliches Verhalten zu bekommen. Ist es in der Regel gegen mit Operanden unterschiedlicher Größe zu tun Arithmetik geraten?

War es hilfreich?

Lösung

char kann entweder mit oder ohne Vorzeichen, je nach Ihrem Compiler.

In Ihrem Fall scheint es, unterzeichnet zu werden, und 255 außerhalb des Bereichs es darstellen kann (wahrscheinlich, kann es nur Zahlen repräsentiert von -128 bis 127).

So das Problem tritt auf, wenn Sie 255 auf Ihre char Variablen zuweisen -. Dies führt zu einer Implementierung definierten Wert, die in Ihrem Fall zu sein scheinen -1

Wenn Sie multiplizieren -1 von 2, erhalten Sie -2. Kein Geheimnis gibt. Die Besetzung zu (int) tut nichts -. Typ schmaler als int ist immer int oder unsigned int gefördert, bevor Berechnungen mit ihnen gemacht werden

Andere Tipps

Es scheint, dass char auf Ihrer Plattform unterzeichnet ist. So ist die char x = 255 effektiv die gleiche wie char x = -1. Die Besetzung zu int spielt keine Rolle.

Versuchen Sie, dass an:

unsigned char x = 255;

Nein, Sie sind nicht einen Überlauf in der zweiten Zeile (Multiplikation) zu bekommen. Das Problem ist der Compiler signed char standardmäßig und 255 überläuft verwendet und bedeutet -1. Grundsätzlich sind Sie initialisiert Variable x mit dem Wert von -1. Casting -1 bis int führt in -1 (signed Operanden erhalten Vorzeichen erweiterten in upcasts während unsigned Operanden erhalten Null-extended).

Sie können die char zwingen unsigned zu sein, indem die unsigned Prefix:

unsigned char x = 255;

Die anderen Antworten gut erklären, wie Ihr Beispiel „funktioniert“, so dass ich nicht das erklärt erneut.

Lassen Sie mich jedoch beobachten, dass wenn das, was Sie verwenden möchten, ist es, einen „unsigned 8-Bit-Integer“, nur Gebrauch <stdint.h> dem uint8_t bereits (und seine 16, 32, 64-Bit-Begleiter) und halten Sie weg von all chars, shorts und ints in dieser Welt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top