2016-08-09 4 views
3

Lesen über die ganze Zahl Förderung und integer Umwandlung Rang fand ich diese linkinteger Umwandlung Rang und Förderung

  • 1. Wenn beide Operanden vom gleichen Typ sind, dann keine weitere Umsetzung benötigt wird.
  • 2.Andernfalls, wenn beide Operanden vorzeichenbehaftete Integer-Typen oder beide vorzeichenlose Integer-Typen haben, wird der Operand mit dem Typ der kleineren Ganzzahl Konvertierungsrang in den Typ des Operanden mit größerem Rang konvertiert.
  • 3.Otherwise, wenn die Operanden, die unsigned integer-Typen hat, um den Rang des Typs des anderen Operanden grßer oder gleich hat Rang, dann der Operand mit signiertem Integer-Typ ist mit dem Typ des Operanden umgewandelt mit vorzeichenloser Integer-Typ

  • 4.Otherwise, wenn der Typ des Operanden mit signiertem Integer-Typ alle Werte von der Art des Operanden mit unsigned Integer-Typ darstellen kann, dann wird der Operand mit unsigned integer Typ umgewandelt den Typ des Operanden mit vorzeichenbehafteten Integer-Typ.

  • 5.Andernfalls werden beide Operanden in den vorzeichenlosen Integertyp umgewandelt, der dem Typ des Operanden mit Ganzzahl mit Vorzeichen entspricht.

Die Punkte 1 2 3 sind völlig klar, aber ich komme immer noch nicht mit Beispiel für den Fall bis 4 und 5. Kann ein Beispiel jemand geben Sie bitte jede Implementierung über?

Wie ich die ganze Zahl Umwandlung Rang wissen ist:

_Bool < char < kurz < int < lange < long long int

Unabhängig von der Größe von Bytes zu den Typen verwandt sind gleich oder höher. Recht?

Betreffend die Förderung oder Umwandlung von einem Typ zum anderen. Sind die Bits, die zum niedrigsten Typ Null oder 1 oder dem linken Extrembit hinzugefügt wurden, davon betroffen?

Ich möchte wissen, wie ist der Prozess in der Bits anzeigen vor allem für die Konvertierung.

Für die Ganzzahl-Promotion kann es immer den Wert und das Zeichen ohne Zweifel bewahren.

+1

In der * bits view * würde es nicht viel Sinn ergeben, da das Bitmuster bei Integer-Promotions weitgehend unverändert ist. –

+1

sie werden immer mit null Bits gefüllt, das ist was Sie sagen wollen und es ist keine Implementierung definiert? @EugeneSh. – rondino

+0

Wenn das vom Standard ist (ist es nicht), zitieren Sie den Paragraphen, usw. Das bloße Verknüpfen einer Site ist ziemlich nutzlos. Das unterscheidet sich wesentlich vom Standard. Beachten Sie auch, dass der C-Standard nur C11 ist. – Olaf

Antwort

4

Fall 4 gilt, wenn Sie einen vorzeichenlosen Typ haben, der einen kleineren Rang als der signierte Typ aufweist, mit dem er arbeitet, und verschiedene Größen haben. Fall 5 dann, wenn die beiden die gleiche Größe sind.

Zum Beispiel ist auf meinem System int 32-Bit, long ist 64-Bit und long long ist 64-Bit.Wenn Sie dann die folgenden Schritte aus:

unsigned int a;  // range: 0 to 4294967295 
long b;    // range: -9223372036854775808 to 9223372036854775807 

unsigned long c;  // range: 0 to 18446744073709551615 
long long d;   // range: -9223372036854775808 to 9223372036854775807 

Für einen Ausdruck, der a und b, das sind unsigned int und long, jede gültige unsigned int in einem long passen. So wird in dieser Situation a in long konvertiert.

Umgekehrt Für einen Ausdruck, der c und d, das sind unsigned long und long long, ein long long kann nicht alle Werte eines unsigned long halten. Daher werden beide Operanden in unsigned long long konvertiert.

In Bezug auf das, was während einer Heraufstufung/Konvertierung auf Bit-Ebene passiert, nehmen wir zuerst an, dass der niedrigere Rang-Typ kleiner als der höhere Rang-Typ ist und dass signierte Typen die Zweierkomplement-Darstellung verwenden.

Für eine Umwandlung von einem 32-Bit int zu einem 64-Bit long, wenn der Wert positiv ist, werden 4 Bytes, die alle 0 Bits enthalten, auf der linken Seite hinzugefügt. Wenn der Wert negativ ist, werden 4 Bytes, die alle 1 Bits enthalten, auf der linken Seite hinzugefügt. Zum Beispiel ändert sich die Darstellung des Werts 5 von 0x00000005 zu 0x0000000000000005. Für den Wert -5 ändert sich die Darstellung von 0xfffffffb zu 0xfffffffffffffffb.

+2

Für das zweite Beispiel ist es der Fall 3. Wenn der Operand, der einen vorzeichenlosen Integer-Typ hat, einen Rang hat, der größer oder gleich dem Rang des Typs des anderen Operanden ist, können Sie sehen, dass auch *** equity *** enthalten ist und "unsigned long" und "long" haben den gleichen Conversion-Rang! – rondino

+1

Jede Art von niedrigerem Umwandlungsrang als "int" ist irrelevant: C11-Entwurfsstandard n1570: * 6.3.1.8 Übliche arithmetische Konvertierungen 1 [Diskussion über Fließkomma] Andernfalls werden die Ganzzahl-Promotions für beide Operanden durchgeführt. Dann werden die folgenden Regeln auf die hochgestuften Operanden angewendet: [...] * Wenn also der gemeinsame reale Typ bestimmt werden soll, ist alles "int" oder höher. – EOF

+0

Dem stimme ich vollkommen zu. erste Beförderung dann Umwandlung. – rondino

Verwandte Themen