【问题标题】:ATmega64a float to IEEE-754 unexpected resultATmega64a 浮动到 IEEE-754 意外结果
【发布时间】: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 的长度子说明符。

http://www.cplusplus.com/reference/cstdio/printf/

【问题讨论】:

  • 至少做到unsigned int i
  • 另外请决定 - 它是在 ATMega64 上运行还是为您的 Mac 运行?目标系统上int 的大小是多少?
  • 也许04A2599A 是正确的——取决于float 编码。第 1 步是报告 floatintunion Data 的大小。
  • user1757006,尝试举报printf("%a\n", var);
  • #include &lt;stdio.h&gt;/#include &lt;float.h&gt;/#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


【解决方案1】:

此处理器是 8 位处理器,这意味着 int 的大小很可能是 2 字节,而不是您的代码假设的 4。

如果可以,请尝试使用uint32_t 而不是int

【讨论】:

  • 如果 int 是 2 字节,04A2599A 的输出很难解释。如果输出是0000599A,当然。
  • 不可否认这很奇怪,但值得一试看看会发生什么。
  • 我认为 user1757006 有left the building
  • 呵呵。好像,但希望他回来。我很好奇可能是什么原因。
  • 我也是。我怀疑 1) atmega 使用了另一种编码 2) 代码缺少真正的 FP 数学,这会在没有 FP 库的情况下搞乱链接 3) 驾驶舱错误。
猜你喜欢
  • 2013-06-12
  • 2012-01-06
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多