ATmega64a 浮动到 IEEE-754 意外结果

ATmega64a float to IEEE-754 unexpected result

我正在尝试将浮点数转换为 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/

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

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