Почему выражение (int) + 1e10 не дает -2147483648, как описывает CSAPP? [дубликат]

Dec 12 2020

Я читаю 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]описан в книге?

Ответы

2 chux-ReinstateMonica Dec 12 2020 at 09:49

Даже если у используемого процессора есть «Любое преобразование из числа с плавающей запятой в целое число, которое не может присвоить разумное целочисленное приближение, дает это значение.», Компилятор не обязан следовать этому, поскольку он может использовать другой код для достижения цели.

В частности, значения, которые могут быть определены во время компиляции, например, some_32_bit_int = (int)+1e10;могут получить значение, подобное some_32_bit_int = 10000000000 & 0xFFFFFFFF;или 1410065408полностью независимое от процессора.

Если значение составной части не может быть представлено целочисленным типом, поведение не определено. C17dr § 6.3.1.4 1

В книге описывается процессор, а не компилятор.