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
的长度子说明符。
此处理器是 8 位处理器,这意味着 int
的大小很可能是 2 个字节,而不是您的代码假设的 4 个字节。
如果可以,请尝试使用 uint32_t
而不是 int
。
我正在尝试将浮点数转换为 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
的长度子说明符。
此处理器是 8 位处理器,这意味着 int
的大小很可能是 2 个字节,而不是您的代码假设的 4 个字节。
如果可以,请尝试使用 uint32_t
而不是 int
。