Попробуйте это:
printf("size of int = %d, size of float = %d, size of double = %d\n",
sizeof(int), sizeof(float), sizeof(double));
Когда вы вызываете printf()
, система помещает аргументы в стек. Таким образом, стек выглядит примерно так:
pointer to format string [probably 4 bytes]
x [probably 4 bytes]
x [probably 4 bytes]
f [probably 6 or 8 bytes]
f [probably 6 or 8 bytes]
Затем printf()
выталкивает байты из стека при разборе строки формата. Когда он видит %d
, он выдает достаточно байтов для целого числа, а когда он видит %f
, он выдает достаточно байтов для числа с плавающей запятой. (На самом деле, числа с плавающей точкой удваиваются, когда они передаются в качестве аргументов функции, но важная идея состоит в том, что им требуется больше байтов, чем целых чисел.) Так что, если вы «врете» аргументы, это приведет к неправильному количеству байтов и вслепую. конвертируйте их согласно вашим инструкциям.
Таким образом, сначала будет выдано правильное количество байтов для xd
, потому что вы правильно сказали, что x является целым числом.
Но тогда он выкинет достаточно байтов для числа с плавающей запятой, которое будет использовать второй x
и часть первого f
из стека и интерпретировать их как число с плавающей запятой для xf
.
Затем он выскакивает достаточно байтов для другого числа с плавающей запятой, которое будет использовать остаток первого f
и часть второго f
, и интерпретировать их как число с плавающей запятой для ff
.
Наконец, он извлечет достаточно байтов для целого числа, которое будет использовать оставшуюся часть второго f
, и интерпретирует их как целое число для fd
.
Надеюсь, это поможет.