. %e
도 고정 표기법 대신 과학 표기법으로 플로트를 인쇄하며 %g
도 과학 또는 고정 중 더 짧은 쪽을 인쇄합니다.
printf()
과 같이 가변 인수 (즉, 불특정 다수의 인수를 취하는 함수)에 인수로 전달 될 때 float 인수가 자동으로 double 형으로 변환되기 때문입니다. 복식으로 표시되는 숫자 2 및 3 (x
및 y
의 값)은 각각 IEEE-754 Floating-Point Conversion calculator에 의해 계산 된 0x4000000000000000 및 0x4008000000000000입니다.
리디 엔디안 컴퓨터 (예 : x86 기반)의 경우 %d
수정자는 스택에서 다음 4 바이트를 가져 와서이를 정수로 해석합니다. 따라서 float 2를 전달하면 0x4000000000000000처럼 double로 변환됩니다. little-endian은 00 00 00 00 00 00 00 40입니다. 처음 4 바이트는 정수 0을 만들어 인쇄됩니다. 당신이 높은 경고 레벨을 설정하면
printf("x=%d y=%d\n", x, y);
// Output: x=0 y=1073741824
대부분의 컴파일러는 이러한 유형의 오류에 대해 경고 할 수 있습니다 대신 두 하나 개의 문장에 모두 번호를 인쇄하는 경우, 당신은 더 놀라운 결과를 얻을 것이라고
는
주 충분히. GCC를 사용하면 -Wformat
옵션 (또는 -Wformat
을 포함하는 -Wall
)으로 컴파일해야하며 우연히 %d
으로 플로트를 인쇄하려고 할 때 경고합니다.
시도해보십시오 printf ("x is % f \ n", x); –
이 실수는 쉽게 할 수 있지만, 그것을 만든 사람에게는 어렵습니다. 다른 사람에게 물어 보면 잠시 후에 대답을 얻을 수 있습니다 :) – Ashwin
사실 float에 대한 printf 변환 지정자가 없습니다. 변환 지정자'% f'는 double 인수를 요구합니다. 다행스럽게도 float 인수는 printf()가 호출 될 때 double로 변환됩니다. 내 제안 : 절대 부유물을 사용하지 마십시오. 항상 double을 사용하십시오. – pmg