Рассмотрим эту программу
int main()
{
float f = 11.22;
double d = 44.55;
int i,j;
i = f; //cast float to int
j = d; //cast double to int
printf("i = %d, j = %d, f = %d, d = %d", i,j,f,d);
//This prints the following:
// i = 11, j = 44, f = -536870912, d = 1076261027
return 0;
}
Может кто-нибудь объяснить, почему кастинг из double/float в int работает правильно в первом случае и не работает, когда выполняется в printf?
Эта программа была скомпилирована на gcc-4.1.2 на 32-битной Linux-машине.
EDIT: Ответ Zach кажется логичным, то есть использовать спецификаторы формата, чтобы выяснить, что нужно удалить из стека. Однако рассмотрим следующий вопрос:
int main()
{
char c = 'd'; // sizeof c is 1, however sizeof character literal
// 'd' is equal to sizeof(int) in ANSI C
printf("lit = %c, lit = %d , c = %c, c = %d", 'd', 'd', c, c);
//this prints: lit = d, lit = 100 , c = d, c = 100
//how does printf here pop off the right number of bytes even when
//the size represented by format specifiers doesn't actually match
//the size of the passed arguments(char(1 byte) & char_literal(4 bytes))
return 0;
}
Как это работает?