首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将浮点值存储在int变量中

问是否可以将浮点值存储在int变量中
EN

Stack Overflow用户
提问于 2019-06-07 19:30:04
回答 5查看 4.5K关注 0票数 2

我想将一个浮点值存储在一个整型变量中,并打印出那个整型变量,然后我想看到浮点值本身。做得到还是做不到?

EN

回答 5

Stack Overflow用户

发布于 2019-06-07 19:36:15

如果想要查看float变量的位模式,可以这样做:

代码语言:javascript
复制
#include <stdio.h>
#include <stdint.h>
#include <string.h>

int main(void) {
    uint8_t bitpattern[sizeof (float)];
    float f = 3.1414;
    memcpy(bitpattern, &f, sizeof (float));

    for (int i = 0; i < sizeof (float); i++)
      printf("%02x ", bitpattern[i]);
}
票数 4
EN

Stack Overflow用户

发布于 2019-06-07 20:29:07

我想将浮点值存储在整数变量中

这可不是个好的开始。但是,如果选择的整数类型足够宽,可以容纳float的表示形式,则可以将float的字节复制到整数中。对于定义好的结果,memcpy将是一种更好的方法。例如,如果float和int都是32位的量,那么

代码语言:javascript
复制
float x = 1.2;
int i;
memcpy(&i, &x, sizeof(x));

这是我所能想到的最接近以整数形式存储float值的方式,这种方式可以容纳整个float范围,并避免丢失任何精度。

并打印该整数变量,我希望看到浮点值本身。

我认为您的意思是要打印float值的人类可读的十进制表示形式。有多个标准库函数可以将float的内部表示形式转换为可打印的十进制表示形式,但它们都接受float作为输入,而不是整数。当然,您可以将浮点表示复制到float类型的对象并使用它,但这似乎与目的不符。但是,如果不这样做,就没有标准库函数可以执行您想要的操作。

在哪里可以做,或者不能做?

当然这是可以做到的。尽管C没有定义使用C的运算符和标准库函数的方法,但如果您假设float表示的细节,那么您可以编写自己的函数来复制(比方说) printf所需的方面,尽管这绝对不是微不足道的。原则上,人们甚至可以编写代码来分析float的实现表示,这样就不需要做任何假设。但是,对于一个只需将float值存储在float对象中就能获得更好结果的结果来说,这是一大堆复杂的代码。

票数 3
EN

Stack Overflow用户

发布于 2019-06-07 19:54:36

来自评论:

我的一个朋友问我这是否可能,我试过了,但就是找不到解决办法,这就是为什么

通过严格回答这个问题,您可以这样做:

代码语言:javascript
复制
#include <stdio.h>

int main(void) {
    int x; // Here is where we store the data
    float *p = (float*) &x; // Make a float pointer point at the integer
    *p = 42.67; // Pretend that the integer is a float and store the value
    printf("%f\n", *(float*)&x); // Print what's inside x, pretending it's a float
}

这样写不是个好主意。请注意,这是未定义的行为,因此C编译器基本上可以自由地生成它想要的任何垃圾。这只是其中一种未定义的行为,在实践中(几乎)总是有效的。至少对于预期的目标平台是这样的。我写这个答案完全是为了证明这是可能的,但正如我所说的,它是UB,并且它不是可移植的。

如果sizeof(float) > sizeof(int),这肯定会失败,但我认为这是由实现定义的。如果是这种情况,请选择一个至少与浮点类型一样大的整数类型。

值得一提的是,类似的东西实际上存在于Quake引擎中。它被称为Carmack hack,尽管它不是John Carmack想出来的。但在那些日子里,cpu周期比可移植性更重要。代码看起来像这样(带有原始注释):

代码语言:javascript
复制
float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking
    i  = 0x5f3759df - ( i >> 1 );               // what the fuck? 
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//  y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

    return y;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56493496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档