Typecasting int pointer to float pointer
我正在尝试执行以下操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| int a [8]={1,2,3,4,5,6,7,8};
printf("%f
", *(float *)a );
printf("%f
", *((float *)a +1));
printf("%f
", *((float *)a +2));
printf("%f
", *((float *)a +3));
printf("%f
", *((float *)a +4));
printf("%f
", *((float *)a +5));
printf("%f
", *((float *)a +6));
printf("%f
", *((float *)a +7)); |
我懂了
1 2 3 4 5 6 7 8
| 0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000 |
我尝试以这种方式打印元素的原因是,我想将指向数组的int指针转换为float指针,并将其作为另一个仅需float *的函数的参数传递。
看来这不能很好地工作。 有人可以解释为什么这行不通吗?
1 2
| int *ptr;
function((float *)ptr); |
如果执行此操作,函数将无法读取指针正确指向的值..仅返回0.0000。
这是不正确的。 int和float不能保证具有相同的对齐方式。
请记住:强制转换值和强制转换指针是不同的方案。强制转换指针会更改引用类型值的方式,在大多数情况下,几乎可以肯定会导致未对齐。
根据C11标准文档,第6.3.2.3章
A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned68) for the referenced type, the behavior is undefined.
在您的情况下,可能的解决方法是
1 2
| printf("%f
", (float)*a ); //cast the value, not the pointer |
-
问题是针对C而不是C ++的
-
@infiniteloop如果我不紧急需要预约眼科医生,我的回答中没有提到CPP,并且我相信我也不需要预约。请澄清一下
-
真诚的道歉@Sourav。我忽略了它。
-
@infiniteloop没关系,我相信我们所有人都有一点幽默的空间,希望我也没有冒犯您,对吗?
-
不,一点也不:),那是我的错误。在gcc 4.8.5 - 64bit之间,其中int和float的大小为4个字节,当我尝试如上所述通过float *将int值转换为float时,将其存储在float中并再次返回到另一个int变量。我可以得到实际数据。根据我的观察,C语言中的printf()实际上不能打印非常低的int值(我的意思是说4字节值存储为整数而不是浮点数),因此它正在打印0。增加int的值并给出正确的结果。
-
根据我的观察,C语言中的printf()实际上无法将int *的很低值打印为float *(我的意思是说,将4字节值存储为整数而不是float),因此它正在打印0.000000。增加int的值会给出正确的结果(我的意思是与int值相对应的float值,即int为10不会给出10.000000,而是根据用于在编译器中实现float的方法给出值)。
您不能将指向int的指针转换为指向float的指针,并期望将您的值转换为浮点表示形式的相应数字。强制转换单个值有效,但通过更改指针类型进行强制转换不会更改表示形式。
如果需要一个float s数组,则声明一个float s数组,然后一次转换一个元素:
1 2 3 4 5
| float b[8];
for (int i = 0 ; i != 8 ; i++) {
b[i] = a[i];
}
func_expects_float(b, 8); |
您可以尝试:
1 2 3 4 5
| printf("%f
", 1.0f * a [0]);
printf("%f
", 1.0f * a [1]);
.... |
==或==
1 2 3 4 5
| printf("%f
", *(a +0) * 1.0f );
printf("%f
", *(a +1) * 1.0f );
.... |
将int指针强制转换为浮点数不会将整数转换为浮点数。强制转换只是告诉机器将指针指向的内存位置的内容用作浮点值而不是整数值。但是,它不会将值从整数表示更改为浮点表示。