Однако обратное действительно не применимо
В системе с прямым порядком байтов (младший байт многобайтового значения находится по самому низкому адресу), int
будет соответствовать младшим значащим битам мантиссы long double
.Вы должны напечатать это long double
с большой точностью, чтобы увидеть влияние этого int
на эти незначительные цифры.
В большой системе с прямым порядком байтов, такой как блок Power PC, все будет иначе: часть int
будет соответствовать самой значимой части long double
, перекрывая ее знаковым битом, экспонентой и наиболее значимыми битами мантиссы.Таким образом, изменения в x
окажут радикальное влияние на наблюдаемое значение с плавающей точкой, даже если будут напечатаны только несколько значащих цифр.Однако для небольших значений x
значение представляется равным нулю.
В системе PPC64 следующая версия программы:
int main(void)
{
union myUnion a;
a.y = 3.2;
int i;
for (i = 0; i < 1000; i++) {
a.x = i;
printf("%d -- %.2Lf\n", a.x, a.y);
}
return 0;
}
не печатает ничего, кроме
1 -- 0.0
2 -- 0.0
[...]
999 - 0.0
Это потому, что мы создаем поле экспоненты со всеми нулями, давая значения, близкие к нулю.Однако начальное значение 3.2 полностью забито;у него не только разорваны наименее значимые биты.