2012-09-01 5 views
3
unsigned long long i = 1000; 

0.1*i은 자동으로 이중으로 변환 되나요? 그렇다면 0.1*iunsigned long long이 필요한 함수 매개 변수로 전달할 때 컴파일러에서 경고 메시지를 표시하지 않는 이유는 무엇입니까? 나는 컴파일러가 이러한 잠재적 인 정밀도의 손실을 경고한다고 생각했다.두 배는 부호없는 부호없는 long은 항상 double입니까?

나는 모든 가능한 경고를 표시하기 위해 "-Weverything"으로 구성된 내 컴파일러 Clang을 보유하고 있습니다.

답변

6

예, 정수 및 부동 소수점 숫자에 대한 연산은 부동 소수점 숫자가됩니다. 그러나 그 결과 (double 값)를 부호없는 long long을 기다리는 함수에 전달하면 암시 적 캐스트가 자동으로 수행되고 결과는 부호없는 long long으로 잘립니다.

경고를받지 못한 이유는 무엇입니까? 왜냐하면 GCC와 마찬가지로 Clang의 -Wall은 모든 경고를 켤 수 없기 때문에 항상 모든 경고를 얻기 위해 -Wextra를 사용할 수 있습니다.

+2

아, 그래. '의심스러운 암시 적 전환'경고 플래그를 켜면 경고가 표시됩니다. 왜 지옥이 "- 모든 것"은 그것이 주장하는 바가 아닌지 궁금합니다. 이것이 나에게 일어나는 두 번째 시간입니다. 모든 경고를 다 커버하지는 않습니다. – NoobOverflow

4

산술 유형의 값을 임의의 산술 유형의 객체에 할당 할 수 있고 표준에서 그에 대한 경고가 필요하지 않기 때문에. 위의 예에서

unsigned long long a = 0.1; // C does not require a warning 

0.1가 할당되기 전에 unsigned long long로 변환된다.

프로토 타입 형식의 함수에 인수를 전달할 때, 인수는 할당 된 것처럼 매개 변수 유형으로 변환됩니다.