给定以下代码片段:
int *iptr;
float *fptr;
float fval;
fval = 0.0;
fptr = &fval;
iptr = fptr;
printf("%d \n", *iptr);
fval = 1.0;
printf("%d \n", *iptr);
输出结果为:
为什么第一个打印语句至少近似于与*iptr相关的值(0.0),而第二个打印语句不是呢?这与浮点数和整数在内存中的表示方式有关。0
1065353216
给定以下代码片段:
int *iptr;
float *fptr;
float fval;
fval = 0.0;
fptr = &fval;
iptr = fptr;
printf("%d \n", *iptr);
fval = 1.0;
printf("%d \n", *iptr);
为什么第一个打印语句至少近似于与*iptr相关的值(0.0),而第二个打印语句不是呢?这与浮点数和整数在内存中的表示方式有关。0
1065353216
printf("%d \n", *iptr);
时,你要求printf
将iptr
指向的值解释为整数。0
的float
版本由int
版本的相同位表示。特别地,这些位都是0
。1.0
,将具有不同的位表示(由IEEE标准定义),当解释为int
时将没有多少意义。语句iptr = fptr;
会引发未定义行为。
因此,猜测结果没有多大意义。
(int*)(void*)(float*)&fval
,我们都知道这是未定义行为。 - Bathshebaiptr = fptr;
iptr
是 int *
类型,fptr
是 float *
类型。这个语句将 fptr
赋值给了 iptr
,它们是不同的类型,这意味着它们现在都指向了 fval
。这违反了严格别名规则。这会导致未定义行为,意味着无法预测的行为。标准对实现处理这种情况没有任何要求。简而言之,应避免导致未定义行为的代码。
浮点数以IEEE754格式存储,其中像1.0这样的数字的值与1有很大不同(它被偏移以允许负数和指数)。您不能将浮点数打印为整数并使结果类似于分配给浮点数的数字。
printf("%d", fval);
- 0xF1