【发布时间】:2016-10-24 17:48:42
【问题描述】:
如下面的代码所示,我正在尝试使用不同的方法将位从一个长 longnum 复制到两个双精度数 d1 和 d2:指针转换 + 取消引用和“按位与”分别。
# include <stdio.h>
int main(void) {
long longnum = 0xDDDDDDDDDDDDDDDD;
double d1 = *((double*)(&longnum));
double d2 = longnum & 0xFFFFFFFFFFFFFFFF;
printf("%ld\n\n",longnum);
printf("%lf\n\n",d1);
printf("%lf\n",d2);
return 0;
}
问题是两个双打的打印方式不同,如下面的输出所示。
-2459565876494606883
-1456815990147462891125136942359339382185244158826619267593931664968442323048246672764155341958241671875972237215762610409185128240974392406835200.000000
15987178197214945280.000000
考虑到DBL_MAX 的大小,即双精度的最大尺寸,在我看来,这个巨大的数字实际上是打印的两个双精度的合理输出。
【问题讨论】:
-
由于严格的别名规则,无论如何它都是 UB..
-
long不需要与double大小相同。 -
1) 您应该使用正确大小的 unsigned 固定宽度类型。 并且使用
_Static_assert来确保double具有相同的大小。它仍然是实现定义的,但至少不会调用未定义的行为。
标签: c pointers casting bit-manipulation type-punning