Технически говоря, нет printf
, каждая библиотека реализует свою собственную, и поэтому ваш метод изучения поведения printf
, делая то, что вы делаете, не будет очень полезен. Вы можете попытаться изучить поведение printf
в вашей системе, и если да, прочитайте документацию и посмотрите исходный код для printf
, если он доступен для вашей библиотеки.
Например, на моем Macbook я получаю вывод 1606416304
с вашей программой.
Сказав это, когда вы передаете float
на вариационную функцию, float
передается как double
.Таким образом, ваша программа эквивалентна объявлению a
как double
.
Чтобы изучить байты double
, вы можете увидеть this answer на недавний вопрос здесь о SO.
Давайте сделаем это:
#include <stdio.h>
int main(void)
{
double a = 1234.5f;
unsigned char *p = (unsigned char *)&a;
size_t i;
printf("size of double: %zu, int: %zu\n", sizeof(double), sizeof(int));
for (i=0; i < sizeof a; ++i)
printf("%02x ", p[i]);
putchar('\n');
return 0;
}
Когда я бегу выше программы, я получаю:
size of double: 8, int: 4
00 00 00 00 00 4a 93 40
Итак, первые четыре байта double
оказалось равным 0, что может быть почему вы получили 0
в качестве выхода вашего звонка printf
.
Для получения более интересных результатов, мы можем изменить программу немного:
#include <stdio.h>
int main(void)
{
double a = 1234.5f;
int b = 42;
printf("%d %d\n", a, b);
return 0;
}
Когда я бегу выше программы на моем Macbook, я получаю:
42 1606416384
С одной и той же программы на Linux машина, я получаю:
0 1083394560
+1, отличный ответ :) – Mizipzor
+1 Лучший ответ. Это отвечает как «стандартным технически правильным», так и «вашей вероятной реализации», почему. –
Я считаю, что вы единственный из 12 человек, которые фактически предоставили ответ, который он искал. – Gabe