She*_*ker 3 c floating-point bit-manipulation
在C中,是否保证两个值相等的双精度(double1 == double2
)具有相同的位模式?
没有这样的保证.
例如,在IEEE浮点格式中,存在负0的概念.它比较等于正0但具有不同的表示.
这是一个例子:
#include <stdio.h>
int main()
{
unsigned long long *px, *py;
double x = 0.0, y = -0.0;
px = (unsigned long long *)&x;
py = (unsigned long long *)&y;
printf("sizeof(double)=%zu\n",sizeof(double));
printf("sizeof(unsigned long long)=%zu\n",sizeof(unsigned long long));
printf("x=%f,y=%f,equal=%d\n",x,y,(x==y));
printf("x=%016llx,y=%016llx\n",*px,*py);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof(double)=8
sizeof(unsigned long long)=8
x=0.000000,y=-0.000000,equal=1
x=0000000000000000,y=8000000000000000
Run Code Online (Sandbox Code Playgroud)
编辑:
这是一个不依赖于类型惩罚的修改示例:
#include <stdio.h>
void print_bytes(char *name, void *p, size_t size)
{
size_t i;
unsigned char *pdata = p;
printf("%s =", name);
for (i=0; i<size; i++) {
printf(" %02x", pdata[i]);
}
printf("\n");
}
int main()
{
double x = 0.0, y = -0.0;
printf("x=%f,y=%f,equal=%d\n",x,y,(x==y));
print_bytes("x", &x, sizeof(x));
print_bytes("y", &y, sizeof(y));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
x=0.000000,y=-0.000000,equal=1
x = 00 00 00 00 00 00 00 00
y = 00 00 00 00 00 00 00 80
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到两者之间的表示差异.一个有符号位设置而另一个没有.