Pourquoi l'expression (int) + 1e10 ne donne pas -2147483648 comme le décrit CSAPP? [dupliquer]

Dec 12 2020

Je lis CS: APP (un assemblage x86-64 / manuel de bas niveau) et il mentionne:

De floatou doubleà int, la valeur sera arrondie vers zéro. Par exemple, 1.999sera converti en 1, tandis que −1.999sera converti en −1.En outre, la valeur peut déborder. Les normes C ne spécifient pas de résultat fixe pour ce cas. Les microprocesseurs compatibles Intel désignent la configuration binaire [10 ... 00] ( TMinwpour la taille du mot w) comme une valeur entière indéfinie. Toute conversion de virgule flottante en entier qui ne peut pas attribuer une approximation d'entier raisonnable donne cette valeur. Ainsi, l'expression (int) +1e10cède -2147483648, générant une valeur négative à partir d'une valeur positive.

Quels sont les microprocesseurs compatibles Intel mentionnés ici? x86architecture comprenant la série AMD?

Quoi qu'il en soit, j'ai un Intel i5 avec une machine Win10 64 bits et j'ai essayé sous Visual Studio:

    #include <iostream>
    using namespace std;
    
    int main() {
        int b = (int)+1e10;
        cout << b << endl;
    }

et obtient 1410065408en sortie.

Aussi j'ai essayé int32_tet obtient 1410065408aussi.

Alors pourquoi n'ai-je pas le résultat -2147483648qui est [10 ... 00]comme le livre le décrit?

Réponses

2 chux-ReinstateMonica Dec 12 2020 at 09:49

Même si le processeur utilisé a "Toute conversion de virgule flottante en entier qui ne peut pas assigner une approximation d'entier raisonnable donne cette valeur.", Le compilateur n'est pas obligé de suivre cela car il peut utiliser un autre code pour atteindre l'objectif.

En particulier, les valeurs qui peuvent être déterminées au moment du compilateur comme some_32_bit_int = (int)+1e10;peuvent obtenir une valeur comme some_32_bit_int = 10000000000 & 0xFFFFFFFF;ou 1410065408qui est complètement indépendante d'un processeur.

Si la valeur de la partie intégrale ne peut pas être représentée par le type entier, le comportement n'est pas défini. C17dr § 6.3.1.4 1

Le livre décrit le processeur, pas le compilateur.