- C - 在int变量中,是否可以存储浮点值

56 0

我想在整数变量中存储一个浮点值,并打印整数变量,并且想要看到浮点值本身,可以做到吗?

时间: 原作者:

112 3

如果你想查看你的float变量的位模式,可以执行以下操作:


#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]);


}



原作者:
66 0

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

这是个错误的开始,但是,如果选择的整数类型足够宽以适应float的表示,那么你可以将float的字节复制到整数中,memcpy将是实现这个更好的方法之一。 例如,如果floatint都是32-bit数量,那么,


float x = 1.2;


int i;


memcpy(&i, &x, sizeof(x));



这是最接近的,把float的值存储在一个整数以满足整个float的范围,避免失去精度。

原作者:
110 3

是否可以在int变量中存储浮点值()?

使用union

float的大小与可用的uintN_t类型匹配时,没有问题。


float a = ...;


// i want to see the float value itself.


printf("%e %an", a, a); // Use exponential notation



// to an integer type


assert(sizeof(float) == sizeof(uint32_t)); 


union {


 float f;


 uint32_t u;


} x = { a };


unsigned long ul = x.u;


// print that integer variable


printf("%lXn", ul);



// and back again


union {


 float f;


 uint32_t u;


} y = { .u = (uint32_t) ul };


float f = y.f;


printf("%e %an", f, f);



注意printf("%lXn", ul);会打印出不明显匹配的内容 printf("%e %an", a, a);

原作者:
142 3

首先,要记住intfloat值的二进制表示是非常不同的,整数值1和浮点值1.0的表示形式很不同,假设32-bit intfloat和IEEE-754表示,我们得到:


 1: 0000 0000 0000 0000 0000 0000 0000 0001 (0x00000001)


1.0: 0111 1111 1000 0000 0000 0000 0000 0000 (0x3f800000)



将float值分配给int对象截断分数部分-如果你编写了:


int b = 1.2f; // 0x3f99999a



存储在b中的值是1 (0x00000001 )。 如果尝试将b分配回float,例如,


float f = b; 



然后存储在f中的值是1.0 (0x3f800000 ),而不是1.2 (0x3f99999a ),

因此,不能通过简单赋值将float值存储在int对象中。

原作者:
...