2016-05-13 2 views
1

C99 und C++ 11 (und vor ihnen POSIX) eingeführt least und fast Typen in der stdint Header, z. int_fast16_t oder .Überlaufverhalten der schnellen Typen von stdint.h

Ich frage mich, welche Garantien des Überlaufverhaltens dieser Typen gegeben sind. Wenn diese die gleichen wie für "normale" Integer-Typen sind (so dass vorzeichenlose Typen beim Überlauf umlaufen), frage ich mich, wie tatsächlich auf einen anderen Typ als den fixed-withd uint8_t Typ abgebildet werden kann und somit schneller ist.

+0

Mögliches Duplikat von [Was ist der Unterschied zwischen "int" und "int \ _fast16 \ _t"?] (Http://stackoverflow.com/questions/30942107/whats-the-difference-between-int-and-int -fast16-t) –

+0

@ KlasLindbäck gibt es kein Wort Überlauf in dieser Frage oder die Antworten erwähnt. –

Antwort

1

C11 n1570 sagt, dass die

The typedef Name int_fastN_t den schnellsten vorzeichenbehaftete Ganzzahl-Typen mit einer Breite von mindestens N bezeichnet. Der typedef Name uint_fastN_t bezeichnet die schnellste unsigned integer Typ mit einer Breite von mindestens N .


So wird kein Verhalten als solche garantiert; Was diese sagen ist, dass int_fastN_t keinen Überlauf im Bereich 2^(n-1) - 1 signiert haben muss ... 2^(n-1) - 1; uint_fastN_t darf keine Umgehung für Werte unter 2^n - 1 haben. Wenn Sie ein genaueres Wraparound-Verhalten benötigen, verwenden Sie keine schnellen Typen und verwenden Sie stattdessen die genauen Breitentypen (auch bekannt als intN_t und uintN_t).

1

Die Überlaufregeln sind die gleichen wie für jede Ganzzahlvariable mit Vorzeichen/Vorzeichen.

uint_fast16_t ist auf die schnellste Größe, die mindestens 16 Bit ist zugeordnet. Wenn die schnellste Größe 32 Bit auf einer Plattform beträgt, wäre das Verhalten anders. Bedenken Sie:

uint_fast16_t k = 1 << 16; 

if (k == 0) { 
    printf("k is 16 bits\n"); 
} else { 
    printf("k is larger than 16 bits\n"); 
} 
1

Wenn dies das gleiche wie für "normale" Integer-Typen sind (so dass unsigned Typen Wrap-around bei Überlauf)

Die Garantien sind genau die gleichen. Ganzzahlige Zahlen mit Vorzeichen werden überlaufen, und Vorzeichen werden umbrochen. Der maximal darstellbare Wert hängt davon ab, für welchen Integer-Typ der Typ ein Alias ​​ist.

I gefragt, wie uint_fast8_t kann tatsächlich auf jede andere Art als die Fest witdh uint8_t Typ

Es kann ein Alias ​​jeder unsigned integer Typ sein abgebildet werden, die mindestens 8 Bits breit ist.

1

Ich frage mich, wie kann tatsächlich auf jede andere Art als die feste Breite uint8_t Typ zugeordnet werden und somit schneller sein.

Erstens gibt muss nicht sein ein uint8_t Typ. Auf einem Wort adressierten 36-Bit-Rechner (sie haben existiert), wäre ein char wahrscheinlich 9 Bits breit. (Wort adressiert bedeutet, dass die natürliche Weise auf Speicher zugreifen in Worte (einiger Größe). Adressierung Teilabschnitte eines Wortes erfordert verschieben und maskieren, und Zeiger, die solche Unterabschnitte benötigen zusätzliche Bits zu verweisen die Untereinheit innerhalb des Wortes.)

auf einer solchen Maschine würde der Compiler Autor die interessante Entscheidung, ob die gleichen wie unsigned char (9 Bits) oder die 36-Bit-Typ sein unsigned int zu machen.

Wie andere bereits gesagt haben, wird es eine Implementierung geben, die diese Typen definiert. Wenn Sie diese Grenze überschreiten, werden die vorzeichenlosen Typen umbrochen und die vorzeichenbehafteten Typen verursachen undefiniertes Verhalten.

+0

Auf einem wortadressierten Rechner kann 'sizeof (int)' vernünftigerweise '1' sein, wodurch' char' so viele Bits wie das Wort enthält. Sie könnten * char * kleiner machen und in der Vergangenheit maskieren/verschieben, aber heute würden Sie Multi-Prozessor-Maschinen benötigen, und C11s Garantien für den atomaren Zugriff auf Objekte machen das Maskieren/Verschieben unpraktisch. – EOF

+0

Das ist eine andere plausible Implementierung, ja. (Die PDP 10 war natürlich nicht Multi-Core.) –

Verwandte Themen