2013-06-12 2 views
6

은 나를 왜, 어떻게이 문제를 해결하려면 1610612736C에서 정수로 float을 곱하는 방법은 무엇입니까? 이 코드를 실행하면

void main(){ 
float a=3.3f; 
int b=2; 
printf("%d",a*b); 
} 

에게 반환?

편집 : 플로트 (b)에 의해 그 동일한 바보 결과를

+0

정수 및 부동 소수점 문제입니다. 제 대답을 참조하십시오. –

+0

@ Carl이 맞습니다. 곱셈 자체가 float/int 문제가 아니지만 _definitely_는 문자열 형식입니다. – paxdiablo

+0

함수'printf'는'int printf (const char * format, ...)'와 같은 * varargs * 메소드입니다. 즉, 첫 번째 인수 이후에 임의의 인수가 필요하며 컴파일 할 때이를 확인할 수 없거나 * 형식 문자열 *에서 가져온 원하는 형식으로 캐스트 할 수 없습니다. 형식 문자열은'% d '을 말하고,'int'를 찾습니다. 표현식'a * b'는'float'이며'double'으로 변환됩니다. 이 타입들은 같은 메모리 크기조차 갖지 않기 때문에, 임시'double'은 물리적으로 반으로 잘라지고'int'로 취급됩니다. 이것은 솔로몬 솔루션이 아닙니다. –

답변

11

float과의 승산의 결과를 반환 2.0f = 난 INT B = 2 바꿀 경우는, 정수 및 부동 소수점의 경우에도 문제가 아니다 intfloat입니다. 그 외에도 printf으로 전달하면 double으로 승급됩니다. %a, %e, %f 또는 %g 형식이 필요합니다. %d 형식은 int 형식을 인쇄하는 데 사용됩니다.

편집 참고 : main의 반환 값은 int이어야합니다. 여기에 고정 된 프로그램입니다 :

#include <stdio.h> 

int main(void) 
{ 
    float a = 3.3f; 
    int b = 2; 
    printf("%a\n", a * b); 
    printf("%e\n", a * b); 
    printf("%f\n", a * b); 
    printf("%g\n", a * b); 
    return 0; 
} 

및 출력 :

$ ./example 
0x1.a66666p+2 
6.600000e+00 
6.600000 
6.6 
+2

와우, '% a'는 (는)'가장 많이 사용하는 printf 역할에서 쓸데없는 형식 지정자 "상 : – paxdiablo

+8

대단하다! IEEE754를 사용하지 않는 시스템에서도 문자열을 통해 부동 소수점 수를 100 % 정확하게 (바이너리) 전송할 수 있습니다. 그것은 모든 명확한 비트를 완전히 모호하지 않게 보존합니다. 사용자는 아마 그것을 보지 않겠지 만 .... –

+0

awesome that works thanks! – Wicelo

2

또는, 당신은 또한

printf("%d\n", (int)(a*b)); 

할 수 있으며, 이것은 당신이 (종류의) 기대하고있는 결과를 인쇄 할 것이다 .

항상 형식 문자열과 일치하도록 변수를 명시 적으로 유형 변환해야합니다. 그렇지 않으면 이상한 값이 인쇄되는 것을 볼 수 있습니다.

관련 문제