2010-02-16 3 views
9

나는이 프로그램을 작업하고 있었고 float에 대해 % f를 사용하고 % d를 사용하면 전혀 다른 것을 알게되었습니다. 왜 이런 일이 일어나는 지 압니까? C의 printf % d와 % f를 사용하여

int main() 
{ 
float a = 1F; 
double b = 1; 

printf("float =%d\ndouble= %f", a, b); 
} 

출력 이것은 데이터의 내부 표현과 관련이있다

float = -1610612736 
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000 
+0

감사합니다. 이제 이해가된다. – user69514

답변

4

가변 매개 변수가 작동하는 방식 때문에 C는 %d%f 이외의 값을 실제로 전달하는 유형을 알지 못합니다. 변수 매개 변수를 전달할 때 기본적으로 (void*)&myvalue을 수행합니다. 컴파일러도 런타임에 함수도 서식 문자열에 지정된 것을 제외하고는 변수의 유형을 결정할 수 없기 때문입니다. 따라서 암시 적 변환을 사용할 수 있더라도 컴파일러는 필요한 변환이 무엇인지 알지 못합니다.

float가 4 바이트 인 반면 double은 대부분의 시스템에서 8 바이트입니다. 따라서 두 가지 유형은 그대로 이진 호환되지 않습니다. 그리고 문자열을 double 또는 다른 호환되지 않는 유형으로 해석하려고하는 것과 같습니다.

+2

맞습니다. 실제로'float'과'double' 사이의 호환성에 대해서는 구체적이지 않습니다. 사실, float 형의 가변 인수는 항상 전달되기 전에 double 형으로 승격됩니다. 즉, float 형은 여기에 관여하지 않습니다. 'printf'에 전달 된 두 값 모두'double' 타입을가집니다. 첫 번째 것은'int '로 해석됩니다 (왜냐하면'% d'지정자 때문입니다). 'int'와'double' 사이의 비 호환성은 관찰되지 않은 정의되지 않은 행동을 일으키는 원인입니다. – AnT

3

이다. 플로트가 완전히 다른 내부 (바이너리) 표현을 갖는 int 인 것처럼 인쇄하려고합니다.

double의 경우와 유사합니다. float 변수 다음에 가비지 (모든 데이터)가있을 수 있습니다. 그 쓰레기는 double 값의 일부로 해석됩니다.

4

%d은 십진수를 나타내며 유형이 int (또는 승격 된 더 작은 부호있는 정수 유형)의 인수를 예상합니다. 부동 소수점 형식 floatdouble은 모두 같은 방식으로 전달되고 (double로 승격 됨) 두 가지 모두 %f을 사용합니다. C99에서 의 큰 크기를 나타 내기 위해 %lf을 사용할 수도 있지만 이것은 순전히 외형입니다 (scanf으로 프로모션이 발생하지 않고 실제로 이것이 효과가 있음을 알 수 있음).

+0

글쎄,이 사실은 http://codepad.org/labE8lgy 사실이지만 어떻게 작동하는지 궁금해. – Earlz

0

% d는 정수를 출력하므로 printf가 변수 a를 int로 해석합니다.

gcc 3.4.6을 사용하면 코드에서 두 값 모두에 대해 0을 얻습니다 (컴파일러 오류가 발생하여 초기화에서 F를 취한 후). 나는 이것이 int가 0으로 해석되는 변수의 부분과 관련이 있다고 의심한다. 그리고 컴파일러가 혼란스러워진다. (아마도 더 나은 설명이 있지만 생각할 수 없다).

둘 다 변수 인쇄물에 % f를 사용하면 두 변수 모두에 대해 1.000000을 사용합니다.

은이 페이지 아래쪽에 변환 문자의 목록을 찾을 수 있습니다 : 모든 의견에 대한

http://www.exforsys.com/tutorials/c-language/managing-input-and-output-operations-in-c.html

+0

'F'와 관련된 컴파일러 오류는 정수에 연결할 수 없기 때문에 (예 :'1.0F'가 좋음)입니다. – RastaJedi