не Во-первых, это имеет ничего общего делать с использованием union
.
Теперь предположим, что вы пишете:
int x = 1.5;
printf("%d\n", x);
что будет? 1.5
не является целочисленным значением, поэтому он получает , преобразованный в целое число (по усечению) и x
, поэтому фактически получает значение 1
, что является точно тем, что напечатано.
То же самое происходит в вашем примере.
float x = 1094795585.0;
printf("%f\n", x);
1094795585.0
не представимо как число одинарной точности с плавающей точкой, поэтому он получает конвертированы к представимому значению. Это происходит путем округления. Два ближайшего значения:
1094795520 (0x41414100) -- closest `float` smaller than your number
1094795585 (0x41414141) -- your number
1094795648 (0x41414180) -- closest `float` larger than your number
Поскольку ваш номер немного ближе к большему значению (это несколько легче увидеть, если вы посмотрите на шестнадцатеричном представлении), она округляет к этому значению, так что это значение хранится в x
, и это значение, которое печатается.
Возможный дубликат [Разница между поплавком и двойным] (http://stackoverflow.com/questions/2386772/difference-between-float-and-double) –
@Ben Voigt: Я не считаю, что это дубликат этого вопроса. Вопрос не спрашивает, какова разница между float и double - он пытается понять поведение, которое выпадает из ошибки представления в любом типе конечного размера. –
, пожалуйста, отредактируйте название и тег вашего вопроса, это не имеет никакого отношения к тому факту, что вы используете 'float' внутри союза. –