CSAPP가 설명하는 것처럼 표현식 (int) + 1e10이 -2147483648을 산출하지 않는 이유는 무엇입니까? [복제]
나는 읽고있다 APP : CS (AN - 64 조립 / 낮은 수준의 교과서)과는 언급 :
부터
float
또는double
까지int
, 값은 0으로 반올림됩니다. 예를 들어1.999
는로 변환1
되고−1.999
는 추가로 변환되며−1.
값이 오버플로 될 수 있습니다. C 표준은이 경우에 대한 고정 결과를 지정하지 않습니다. Intel 호환 마이크로 프로세서 는 비트 패턴 [10 ... 00] (TMinw
워드 크기의 경우w
)을 정수 무한 값으로 지정합니다. 적절한 정수 근사값을 할당 할 수없는 부동 소수점에서 정수로 변환하면이 값이 생성됩니다. 따라서 표현식(int) +1e10
은를 산출-2147483648
하여 양수에서 음수 값을 생성합니다.
여기에 언급 된 Intel 호환 마이크로 프로세서 는 무엇입니까 ? x86
AMD 시리즈를 포함한 아키텍처?
어쨌든 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]
무엇입니까?
답변
사용 된 프로세서에 "합리적인 정수 근사값을 할당 할 수없는 부동 소수점에서 정수로의 모든 변환이이 값을 산출합니다."라고해도 컴파일러 는 목표를 달성하기 위해 다른 코드를 사용할 수 있으므로이를 따를 필요가 없습니다.
특히, 수있는 값은 결정 컴파일러 같은 시간 some_32_bit_int = (int)+1e10;
과 같은 값을 얻을 수 some_32_bit_int = 10000000000 & 0xFFFFFFFF;
또는 1410065408
그 프로세서는 완전히 독립적이다.
정수 부분의 값을 정수 유형으로 표시 할 수없는 경우 동작이 정의되지 않습니다.
C17dr § 6.3.1.4 1
이 책은 컴파일러가 아니라 프로세서를 설명합니다.