CSAPP가 설명하는 것처럼 표현식 (int) + 1e10이 -2147483648을 산출하지 않는 이유는 무엇입니까? [복제]

Dec 12 2020

나는 읽고있다 APP : CS (AN - 64 조립 / 낮은 수준의 교과서)과는 언급 :

부터 float또는 double까지 int, 값은 0으로 반올림됩니다. 예를 들어 1.999는로 변환 1되고 −1.999는 추가로 변환되며 −1.값이 오버플로 될 수 있습니다. C 표준은이 경우에 대한 고정 결과를 지정하지 않습니다. Intel 호환 마이크로 프로세서 는 비트 패턴 [10 ... 00] ( TMinw워드 크기의 경우 w)을 정수 무한 값으로 지정합니다. 적절한 정수 근사값을 할당 할 수없는 부동 소수점에서 정수로 변환하면이 값이 생성됩니다. 따라서 표현식 (int) +1e10은를 산출 -2147483648하여 양수에서 음수 값을 생성합니다.

여기에 언급 된 Intel 호환 마이크로 프로세서 는 무엇입니까 ? x86AMD 시리즈를 포함한 아키텍처?

어쨌든 Win10 64 비트 컴퓨터가있는 Intel i5가 있고 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

이 책은 컴파일러가 아니라 프로세서를 설명합니다.