【发布时间】:2020-03-16 21:13:28
【问题描述】:
我正在尝试将浮点数转换为 IEEE-754 十六进制表示。以下代码适用于我的 Mac。
#include <stdio.h>
#include <stdlib.h>
union Data {
int i;
float f;
};
int main() {
float var = 502.7;
union Data value;
value.f = var;
printf("%08X\n", value.i);
return 0;
}
这给了我 43FB599A 的预期结果。
当我在 ATmega64a 上运行此代码时,我得到的是 0000599A 而不是最初发布的 04A2599A,这是一个错误。
前两个字节不是预期的,但最后两个字节似乎正确?
有什么想法吗?
正如接受的答案中提到的,我假设 int 是 4 个字节。我正在我的 Mac 上编写代码并将其发送给正在将其下载到 8 位 ATmega64a 的人。在 ATmega64a 上,int 是 2 个字节,而不是 4 个。我将 int 更改为 unsigned long,在 ATmega64a 上是 4 个字节。
此外,我必须在给 printf 的格式中添加一个长度子说明符 l。这是因为当给定 x 的说明符时,printf 使用 unsigned int 的类型来解释相应的参数。添加 l 的长度子说明符告诉 printf 使用 unsigned long 的类型来解释相应的参数。
仅使用 l 的长度子说明符而不将变量 i 更改为 unsigned long 会导致 printf 获取一些额外的字节并输出 04A2599A,如最初发布的那样。当然,我需要将i 的类型更改为unsigned long,并使用l 的长度子说明符。
【问题讨论】:
-
至少做到
unsigned int i -
另外请决定 - 它是在 ATMega64 上运行还是为您的 Mac 运行?目标系统上
int的大小是多少? -
也许
04A2599A是正确的——取决于float编码。第 1 步是报告float、int、union Data的大小。 -
user1757006,尝试举报
printf("%a\n", var); -
#include <stdio.h>/#include <float.h>/#define p(x) printf(#x " = %d.\n", x)/int main(void) { p(FLT_RADIX); p(FLT_MANT_DIG); p(FLT_MIN_EXP); p(FLT_MAX_EXP); }的输出是什么?编译器文档对浮点格式有什么说法?
标签: c floating-point ieee-754 atmega atmelstudio