我碰巧有一个嵌入式程序,需要我做一些操作来存储更多信息。
我有两条短裤和一条漂浮物。我需要将它存储为双(64位),然后检索所有信息而不会损失该双精度。我只能使用C99有效操作,甚至无法进行双位移位。
short x = 4012; short y=1234; float s = 0.8;
double store = 0;
不幸的是,我不确定如何解决这个问题。
答案 0 :(得分:5)
使用联盟:
union Foo {
struct {
short x;
short y;
float s;
} ssf;
double dbl;
};
int main() {
union Foo v;
v.ssf.x = 4012;
v.ssf.y = 1234;
v.ssf.s = 0.8f;
// read a double
double store = v.dbl;
// set the double value
v.dbl = store;
// read the float back out
printf("%f\n", v.ssf.s);
return 0;
}
答案 1 :(得分:1)
如果你把你的短裤和浮子放在一个小块中,它将字面上是2个短裤和一个漂浮在连续记忆中。相同的内存占用。但是你不必操作位来访问和修改各个变量。可能使用结构实际上会保存内存,因为在与short和float交互时,不需要中间变量来放入CPU寄存器。此外,你会在你的小巧代码中发现大量潜在的错误。
答案 2 :(得分:1)
作为nemequ答案的补充,内部struct
可以是匿名的,以避免不必要的打字:
union Foo {
struct {
short a;
short b;
float c;
};
double d;
};
int main() {
union Foo foo;
foo.a = 12;
foo.c = 2.3f;
}