Почему выражение (int) + 1e10 не дает -2147483648, как описывает CSAPP? [дубликат]
Я читаю CS: APP (учебник по сборке x86-64 / низкоуровневый), и в нем упоминается:
От
float
илиdouble
доint
значение будет округлено до нуля. Например,1.999
будет преобразовано в1
, а−1.999
будет преобразовано в−1.
Кроме того, значение может быть переполнено. Стандарты C не определяют фиксированный результат для этого случая. Intel-совместимые микропроцессоры обозначают битовую комбинацию [10 ... 00] (TMinw
для размера словаw
) как целое неопределенное значение. Любое преобразование из числа с плавающей запятой в целое число, которое не может присвоить разумное целочисленное приближение, дает это значение. Таким образом, выражение(int) +1e10
дает результат-2147483648
, производя отрицательное значение из положительного.
Какие микропроцессоры, совместимые с Intel, упоминаются здесь? x86
архитектура включая серию AMD?
Во всяком случае, у меня Intel i5 с 64-битной машиной Win10, и я пробовал в Visual Studio:
#include <iostream>
using namespace std;
int main() {
int b = (int)+1e10;
cout << b << endl;
}
и получает 1410065408
на выходе.
Тоже пробовал int32_t
и 1410065408
тоже попадает .
Так почему же у меня нет результата, -2147483648
который [10 ... 00]
описан в книге?
Ответы
Даже если у используемого процессора есть «Любое преобразование из числа с плавающей запятой в целое число, которое не может присвоить разумное целочисленное приближение, дает это значение.», Компилятор не обязан следовать этому, поскольку он может использовать другой код для достижения цели.
В частности, значения, которые могут быть определены во время компиляции, например, some_32_bit_int = (int)+1e10;
могут получить значение, подобное some_32_bit_int = 10000000000 & 0xFFFFFFFF;
или 1410065408
полностью независимое от процессора.
Если значение составной части не может быть представлено целочисленным типом, поведение не определено.
C17dr § 6.3.1.4 1
В книге описывается процессор, а не компилятор.