Neben zwei chars produziert int
Habe ich eine einfache Programm-und es kompiliert mit GCC-4.4/4.5 wie folgt:
int main ()
{
char u = 10;
char x = 'x';
char i = u + x;
return 0;
}
g++ -c -Wconversion a.cpp
Und ich habe die folgenden:
a.cpp: In function ‘int main()’:
a.cpp:5:16: warning: conversion to ‘char’ from ‘int’ may alter its value
Die gleiche Warnung: ich habe für folgenden code:
unsigned short u = 10;
unsigned short x = 0;
unsigned short i = u + x;
a.cpp: In function ‘int main()’:
a.cpp:5:16: warning: conversion to ‘short unsigned int’ from ‘int’ may alter its value
Könnte jemand bitte erklären Sie mir, warum neben zwei chars (oder zwei unsigned shorts) produziert int?
Ist es ein compiler-bug oder ist es standard-konform?
Dank.
- Ich Frage mich, ob es einige compiler-Optimierung Los hier, wobei das 'u' in Ihrer Ergänzung wird nur immer durch das literal mit dem Wert 10. Aber das scheint ziemlich buggy und non-standards-compiant.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie sehen, ist das Ergebnis der so genannten "üblichen arithmetischen Konversionen", die auftreten, während arithmetische Ausdrücke, besonders solche, die Binär in der Natur (zwei Argumente).
Dies ist beschrieben in §5/9:
Den Aktionen angesprochen in §4.5:
Von hier aus Rubriken wie "Multiplikative Operatoren" oder "Additive Operatoren" haben alle den Satz: "Die üblichen arithmetischen Umwandlungen werden durchgeführt..." zum angeben des Typs des Ausdrucks.
In anderen Worten, wenn Sie integraler Arithmetik der Typ ist bestimmt mit den Kategorien oben. In Ihrem Fall, die Förderung ist abgedeckt durch §4.5/1 und den Typ der Ausdrücke sind
int
.char
gefördert werden, um eineint
(oderunsigned int
), weil, als er forderte, die Sie ist Cabrio dieser Form ("kann").char
?Wenn Sie eine arithmetische operation auf
char
Typ, der das zurückgegebene Ergebnis istint
geben.Sehen:
Ausgabe:
Demonstration bei ideone : http://www.ideone.com/jNTMm
char
s zusammen könnte leicht overflow das Ergebnis, aber nicht wenn das Ergebnis geben wird, die mindestens zweimal die Breite der Originale ein!sizeof(int)>sizeof(char)
. Die Begründung war (soweit ich das sehen kann), dass die Zugabe erfolgt durch die CPU, und viele RISC-CPU ' s nur in voller Breite neben. Sie 'd am Ende mit einer 16-oder 32-bit Wert in ein register. Die Begrenzung aufchar
Breite nehmen würde, einen zusätzlichen Betrieb.int i; sizeof(i+i);
ist4
auch gleich vonshort s; sizeof(s+s)
. Ich denke, es hat mehr zu tun mit dem Betrieb mitint
s, Wann immer möglich (d.h. bei int ist groß genug) als Abdeckung überlauf.sizeof
dort wird geregelt durch die Plattform/die Umsetzung.wenn Sie das hinzufügen dieser zwei Zeichen mit einander, Sie werden zuerst gefördert wird, um int.
Das Ergebnis einer addition ist ein rvalue, die implizit gefördert
Typ int, wenn nötig, und wenn ein int enthalten kann, der resultierende Wert.
Dies gilt auf jeder Plattform, wo sizeof(int) > sizeof(char).
Aber hüten Sie sich vor der Tatsache, dass der char könnte mit behandelt werden als signed char durch
Ihr compiler.
Diese links kann der weiter helfen kann - wiki und securecoding