【问题标题】:Typecasting int pointer to float pointer将 int 指针类型转换为浮点指针
【发布时间】:2015-05-16 14:06:41
【问题描述】:

我正在尝试执行以下操作

int a[8]={1,2,3,4,5,6,7,8};

printf("%f\n", *(float *)a);
printf("%f\n", *((float *)a+1));
printf("%f\n", *((float *)a+2));
printf("%f\n", *((float *)a+3));
printf("%f\n", *((float *)a+4));
printf("%f\n", *((float *)a+5));
printf("%f\n", *((float *)a+6));
printf("%f\n", *((float *)a+7));

我明白了

0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

我尝试以这种方式打印元素的原因是,我想将指向数组的 int 指针转换为浮点指针,并将其作为参数传递给另一个只接受 float * 的函数。

这似乎不太好用。有人可以解释为什么这不起作用吗?

int *ptr;
function((float *)ptr);

如果我这样做,函数不会正确读取指针指向的值。只是返回0.0000

【问题讨论】:

  • 你的期望值是多少?
  • 你为什么要这样做?

标签: c pointers floating-point int type-conversion


【解决方案1】:

这是不正确的。 intfloat 不保证具有相同的对齐方式。

记住:转换值和转换指针是不同的场景。投射指针会改变 方式 以引用 type 值,这可能几乎肯定会导致 most 个案例。

根据C11 标准文档,章节§6.3.2.3

指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未正确对齐68),则行为未定义。

在您的情况下,解决方法可能是

printf("%f\n", (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 的值并给出正确的结果。
【解决方案2】:

您不能强制将指向int 的指针转换为指向float 的指针,并期望将您的值转换为浮点表示中的相应数字。转换单个值有效,但通过更改指针类型进行转换不会改变表示。

如果您需要一个floats 数组,请声明一个floats 数组,并一次转换一个元素:

float b[8];
for (int i = 0 ; i != 8 ; i++) {
    b[i] = a[i];
}
func_expects_float(b, 8);

【讨论】:

    【解决方案3】:

    将 int 指针转换为浮点数不会将整数转换为浮点数。强制转换只是告诉机器使用指针指向的内存位置的内容作为浮点值而不是整数值。但它不会将值从整数表示更改为浮点表示。

    【讨论】:

      【解决方案4】:

      你可以试试:

      printf( "%f\n", 1.0f * a[0]); 
      printf( "%f\n", 1.0f * a[1]); 
      .... 
      

      ==或==

      printf( "%f\n", *(a+0) * 1.0f ); 
      printf( "%f\n", *(a+1) * 1.0f ); 
      ....
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2017-02-12
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多