Я пытаюсь преобразовать число с плавающей точкой в шестнадцатеричное представление IEEE-754. Следующий код работает на моем Ma c.
#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 байта. Я писал код на моей ма c и отправлял кому-то, кто загружал его на 8-битный ATmega64a. На ATmega64a int
это 2 байта, а не 4. Я изменил int
на unsigned long
, что составляет 4 байта на ATmega64a.
Кроме того, мне пришлось добавить суб-спецификатор длины l
в формате, заданном для printf. Это связано с тем, что когда задан спецификатор x
, printf использует тип unsigned int
для интерпретации соответствующего аргумента. Добавление суб-спецификатора длины l
указывает printf использовать тип unsigned long
для интерпретации соответствующего аргумента.
Использование только суб-спецификатора длины l
без изменения переменной i
to unsigned long
заставлял printf захватывать лишние байты и выводить 04A2599A
, как первоначально отправлено. Мне, конечно, нужно было изменить тип i
на unsigned long
, а также использовать под-спецификатор длины l
.
http://www.cplusplus.com/reference/cstdio/printf/