gpt4 book ai didi

有人可以解释为什么我的第一个打印 0,但在 *p = 6.35 之后,它可以打印 6.35?

转载 作者:行者123 更新时间:2023-11-30 20:19:02 26 4
gpt4 key购买 nike

#include <stdio.h>
void print_binary(int n);
void test();

int main(){
test();
return 0;
}
void print_binary (int n){
unsigned int mask = 0;
mask = ~mask^(~mask >> 1);
for (; mask != 0; mask >>= 1){
putchar ((n & mask) ? '1' : '0');
}
}
void test(){
int x;
float *p;
p = (float *) &x;
printf ("x init value :%d\n", x);
printf ("addr x and p are %p %p\n", &x, p);
printf ("print x in bit ");
print_binary(x);
printf ("\n");//00000000000000000000000000000000
*p = 6.35;
printf ("print x in bit ");
print_binary(x);
printf ("\n");//01000000110010110011001100110011
printf ("x after 6.35 value :%d\n", x);//1087058739
printf ("call1 x:%.100f\n", x);//0.0000000.....
printf ("x:%d\n", x);//1087058739
printf ("call2 x:%f\n", x);//0.000000
printf ("p:%f\n", *p);//6.350000
printf ("call3 x:%f\n", x);//6.350000
}

结果:

x init value :0                                                                                                                                                                    
addr x and p are 0x7ffc37d5ba8c 0x7ffc37d5ba8c
print x in bit 00000000000000000000000000000000
print x in bit 01000000110010110011001100110011
x after 6.35 value :1087058739
call1 x:0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
x:1087058739
call2 x:0.000000
p:6.350000
call3 x:6.350000

我在 *p = 6.35; 之后打印我的 x,并且在内存中,我们得到01000000110010110011001100110011,这是根据IEEE754的正确数字,有人可以解释为什么我的第一个 printf ("call1 x:%.100f\n", x) 打印我 0.00...,但是在我 printf ("p:%f\n", *p) 后,它可以打印 6.35

最佳答案

解引用pundefined behavior ,因为 p 不是指向 float,而是指向 int(引用例如 What is the strict aliasing rule? )。

此外,尝试使用 "%f" 格式说明符打印 int 是未定义的行为,因为该格式说明符 expects a double (引用例如Why does printf("%f",0); give undefined behavior?)。

因此,您不能依赖此代码的任何行为 - 一切皆有可能。

实际上,可能发生的情况是,编译器决定将 *p = 6.35; 移到 printf ("p:%f\n", *p); 之前。 .

关于有人可以解释为什么我的第一个打印 0,但在 *p = 6.35 之后,它可以打印 6.35?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52036382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com