我正在尝试编写一个自动化测试程序,要求我生成一个int数组数据流(实际上保存浮点数据)
要生成该int数组,我尝试
将浮点数写入char字节数组,然后
将char字节数组转换为int数组,稍后
将int数组中的数字转换回浮点数(不丢失小数点)。
我能够做第1步& 2没有问题,但我无法使用(float)(* int_ptr)将int数组转换回浮点数。
我的代码:
int ibuff[10];
int *int_ptr;
float f=0.1;
char c [sizeof(float)];
memcpy(c, &f, sizeof(float)); //now c is 0x3f800000;
ibuff[0]=(c[3]<<24 | c[2]<<16 | c[1]<<8 | c[0]); //ibuff[0] is now also 0x3f800000
int_ptr=&ibuff[0];
printf("%f\n", (float)(*int_ptr)); //this will print out 1065353216.0000, and not 1.0 as I expected
答案 0 :(得分:0)
在您的打印声明中:
(float)(*int_ptr)
您正在将一个int转换为float,即(float)(int)(x)
将x
的值作为float而不是int。你想要的是作为一个浮点数进行交互的位置的记忆,所以你需要:
*(float *)(int_ptr)
答案 1 :(得分:0)
您的直接问题来自将解除引用的整数指针int_ptr
转换为float
,然后尝试将该值打印为float
。您目前正在尝试:
printf("%f\n", (float)(*int_ptr));
你找到的将无效。您要做的是将 int_ptr
所占地址的值解释为float
。为此,您需要:
printf("%f\n", *(float*)(int_ptr));
虽然您可以将地址视为任何类似的地址,但您必须确保不会违反C规范中规定的严格别名规则6.5 (6)
和6.5 (7)
。指定了有限的例外,但如上所述:&#34;意图......是指定对象可能或可能没有别名的情况。&#34; 从技术上讲,你的演员来自int
到float
是一种违规行为,它被一个指针所掩盖(通过干预使用一个字符阵列来达到这一点,这使得水更加混乱)。