2014-04-05 7 views
0

나는 방금 sizeof 연산자를 테스트하기 위해 무언가를 썼다.(2 * 3.14f)의 유형은 무엇입니까?

첫째,이 프로그램을 만들면 GCC에서 경고합니다.

main(){ 
    printf("%d", (2*3.14f)); 
} 
// test.c|2|warning: format '%d' expects argument of type 'int', 
// but argument 2 has type 'double' [-Wformat=] 

그래서 GCC는 (2*3.14f)의 유형 double 믿고있다.

나는 sizeof 연산자를 추가했습니다. 출력은 정확히 8이 될 것이며, 이는 double의 크기입니다.

main(){ 
    printf("%d", sizeof(2*3.14f)); 
} 
//Output: 4 

이것은 정말로 혼란 스럽습니다. 질문은 다음과 같습니다. (2*3.14f)의 유형은 무엇입니까?

답변

4

(2*3.14f)을 입력있다 float. Variadic 함수에 전달 될 때 double으로 승격되므로 GCC의 오류 메시지에서 double을 참조하십시오.

당신은이 int, 사용 것처럼 당신이 float의 비트를 표시하려면 printf("%d", (int)…);

을 사용합니다 floatint로 변환 표시하려면 :

int i; 
assert(sizeof(f) == sizeof(i)); 
memcpy(&i, &f, sizeof(f)); 
printf("%d", i); 
1

두 호출 모두 정의되지 않은 동작이 있습니다. 실제로 첫 번째 인수는 double 유형과 두 번째 size_t 유형이므로 형식 지정자 %f%zu을 각각 사용해야합니다.

(2 * 3.14f의 유형 때문에 일반적인 산술 변환의, float이지만, 변수 인수로 전달하고 있기 때문에 인수가 부동 소수점 변환에서 double로 승격됩니다.)