2015-05-27 10 views
5

Von C++ 11-Standard (Entwurf n3337) §5/9:Was bedeutet Rang in Bezug auf Typumwandlung?

- Wenn beide Operanden vom gleichen Typ sind, wird keine weitere Umwandlung ist benötigt.

- Andernfalls, wenn beide Operanden haben Integer-Typen unterzeichnet oder beide haben unsigned Integer-Typen, die Operanden mit der Art der geringeren integer Umwandlung Rang wird mit größer Rang auf den Typ des Operanden umgewandelt werden .

- Andernfalls, wenn der Operand, unsigned integer Typ hat rank größer als oder gleich dem rank des Typs des anderen Operanden, der Operand mit signierten Integer-Typ sind je nach Art umgewandelt werden, von der Operand mit vorzeichenlosen Integer-Typ.

- Andernfalls, wenn der Typ des Operanden mit signiertem Integer-Typ kann alle Werte von der Art des Operanden mit unsigned Integer-Typ darstellt, wird der Operand mit unsigned integer Typ seine den Typ umgewandelt von der Operand mit vorzeichenbehafteten Integer-Typ.

- Andernfalls müssen beide Operanden in den vorzeichenlosen Integer vom Typ konvertiert werden, der dem Typ des Operanden mit der Ganzzahl mit Vorzeichen entspricht.

Was bedeutet Rang in diesem Zusammenhang?
Sicherlich ist es nicht zu std::rank Bezug genommen wird,
als dass mit der Anzahl der Dimensionen in einem Array zu tun hat ...

in Form von integrierten Typen und Punkttypen schwimmen, ich denke, es auf ihre möglichen Größen bezieht sich .

Die C++ Standard garantiert, dass:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) 

bin ich recht dann davon ausgehen, dass die Reihen sind dann:

RankType
1char
2short
3int
4long
5long long
...

Ich konnte nirgends eine list finden, die die Rangstufe für jeden Typ beschreibt.

+0

Siehe 4.13/p1 ([conv.rank]). – 0x499602D2

+0

@ 0x499602D2 Yup, das war, was ich gesucht habe. –

Antwort

6

Die 4.13 section sagt, dass

Jeder Integer-Typ eine ganze Zahl Umwandlung Rang hat wie folgt definiert:

- Keine zwei signierten Integer-Typen außer char und signed char (wenn char unterzeichnet wird) wird haben den gleichen Rang, auch wenn sie die gleiche Darstellung haben.

- Der Rang eines vorzeichenbehafteten Integer-Typs muss größer sein als der Rang jeder Ganzzahl-Typ mit Vorzeichen mit einer kleineren Größe.

- Der Rang von long long int soll den Rang eines langen int größer als, der größer ist als der Rang von int sein soll, die größer ist als der Rang eines short int sein soll, die als das größer sein soll Rang des signierten Char.

- Der Rang jeder unsigned integer Typs ist der Rang des gleich ganzzahliger Typ

signiert entsprechende - Der Rang von jedem Standard-Integer-Typ größer sein soll als der Rang jeder erweiterten Integer-Typ mit der gleichen Größe.

- Der Rang von char soll dem Rang von signed char und unsigned char entsprechen.

- Der Rang von bool muss kleiner als der Rang aller anderen Integer-Typen sein.

- Die Ränge von char16_t, char32_t und wchar_t müssen den Rängen ihrer zugrunde liegenden Typen (3.9.1) entsprechen.

- Der Rang jedem erweiterte vorzeichenbehaftete Ganzzahl-Typs relativ zu einem anderen Integer-Typ mit der gleichen Größe signierte ausgefahren ist Implementierung definiert, aber immer noch unter den anderen Regeln für die ganzzahligen Umwandlungs rank zu bestimmen.

- Für alle ganzzahligen Typen T1, T2 und T3, wenn T1 einen höheren Rang als T2 hat und T2 einen höheren Rang als T3 hat, dann muss T1 einen höheren Rang als T3 haben.