Pourquoi l'expression (int) + 1e10 ne donne pas -2147483648 comme le décrit CSAPP? [dupliquer]
Je lis CS: APP (un assemblage x86-64 / manuel de bas niveau) et il mentionne:
De
float
oudouble
àint
, la valeur sera arrondie vers zéro. Par exemple,1.999
sera converti en1
, tandis que−1.999
sera 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] (TMinw
pour la taille du motw
) 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) +1e10
cède-2147483648
, générant une valeur négative à partir d'une valeur positive.
Quels sont les microprocesseurs compatibles Intel mentionnés ici? x86
architecture 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 1410065408
en sortie.
Aussi j'ai essayé int32_t
et obtient 1410065408
aussi.
Alors pourquoi n'ai-je pas le résultat -2147483648
qui est [10 ... 00]
comme le livre le décrit?
Réponses
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 1410065408
qui 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.