konvertieren von int zu short in C
Habe ich:
int a = 2147483647;
short b = (short)a;
bekommen und habe b = -1
während ich erwarte, dass int32
umgewandelt werden int16
(short
). Ich erwarte, um zu sehen, einige Wert und nicht -1
.
Bitte jemand mir helfen mit diesem.
- Ich würde sagen, der Wert nicht passt, so sind die Ergebnisse undefiniert.
-1
ist "etwas Wert". Und die(short)
cast ist unnötig; die Umwandlung erfolgt implizit:short b = a;
- Das Ergebnis der Konvertierung wird durch die Implementierung festgelegt, nicht undefined.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre int A größer ist als die Größe der kurze. Wenn Sie konvertieren zu kurz, Sie bekommen eine 1 in der am weitesten Links gelegene bit, die gehen, um anzuzeigen, dass es eine negative Zahl. Da bist du immer -1, nehme ich an, Sie sind immer 1s in allen 16 bits, die gehen, um Ihnen -2^15 + 2^14 + 2^13... + 2^0, die geben Sie -1. In kurzen (kein Wortspiel beabsichtigt), Sie können nicht konvertieren die ganze Zahl in eine kurze, wenn es zu groß ist.
Den Wert 2147483647 oder 231-1 überläufe 16-bit-Ganzzahl. Seine binäre Darstellung ist der Nullpunkt in der MSB, gefolgt von 31 in den restlichen bits.
Sieht es aus wie in Ihrer Umsetzung sind die letzten 16 bit genommen, um die Umstellung auf
short
. Wenn dies geschieht, alle von Ihnen sind zu1
, was in einem 2 ergänzen Darstellung-1
:Jedoch weder die 2-Kompliment-Darstellung, noch das Allgemeine Verhalten ist Teil der C++ - standard, so dass dieses Verhalten wird durch die Implementierung festgelegt.
Konvertieren Sie einen Wert in eine unterzeichnet geben, wenn der source-Wert passt nicht in den Zieltyp, ergeben einen Implementierung-definiert Folge. Das bedeutet, dass alle konformen compiler-Dokumentation zu dokumentieren, was das Ergebnis ist.
(Dies ist im Gegensatz zu dem Verhalten auf überlauf einer arithmetischen operator. Zum Beispiel:
eigentlich hat Undefiniertes Verhalten. Aber in jedem Fall sollten Sie vorsichtig sein, um Ihren code schreiben, damit es nicht zu lösen diese Art von problem.)
Für viele Implementierungen, die sowohl für die Konvertierung und-Arithmetik ein überlauf, wo das Ziel ist, eine N-bit-Typ nimmt einfach die N niedrigwertigen bits des richtige Ergebnis.
In Ihrem Fall scheinbar
int
ist 32 bit undshort
ist 16 bits (die Größen können variieren in verschiedenen Implementierungen).2147483647
ist0x7fffffff
, die niederwertigen 16 bits0xffff
ist (wieder, auf Ihre Umsetzung) die Darstellung der-1
im Typshort
.Für die Konvertierung zu unsigned-Typen, das Ergebnis ist genau definiert durch die Norm; es nimmt den niedrigwertigen N bits des Ergebnisses. Und zum überlaufen floating-point-conversion (sagen die Konvertierung von sehr großen
double
Wertfloat
), ist das Verhalten undefiniert.So weit, das ist alles das gleiche für C und C++. Aber nur um die Verwirrung hinzuzufügen, beginnend mit dem Jahr 1999-standard ein überlaufen Vorzeichenwechsel ist erlaubt, zu erhöhen, eine von der Implementierung definierte signal. C++ hat dies nicht. Ich weiß nicht jeder compiler, der das wirklich macht.
-1
ist "etwas Wert". Gab es eine spezifische Wert, den Sie erwarten?Übrigens:
Der cast ist unnötig. Zuweisung, Initialisierung, Parameterübergabe, und die
return
- Anweisungen zuweisen können Werte zwischen numerischen Typen ohne cast. Der Wert umgewandelt wird implizit:Dies ist
implementation defined
Verhalten, zum Beispielgcc
Integer-Implementierung-Dokument
sagt:Diese können sich von compiler zu compiler, ich bin nicht in der Lage zu Graben, bis ähnliche Dokumente für
clang
nochvisual studio
.Vom Entwurf der C++ - standard, Abschnitt
4.7 Integral conversions
Absatz3
:Wenn dies
unsigned
dann Sie hätte sehr gut definiert Verhalten nach§2
:Die Sprache ist ähnlich wie in der
C99
Norm-Entwurf Abschnitt6.3.1.3 Signed and unsigned integers
.Können Sie dies tun:
check-Summe ist
0x1234
.Hier ist noch eine Möglichkeit:
Ausgabe
1234
.