ATmega64a плавать до IEEE-754 неожиданный результат - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь преобразовать число с плавающей точкой в ​​шестнадцатеричное представление 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/

1 Ответ

0 голосов
/ 17 марта 2020

Это 8-битный процессор, средний размер которого int, скорее всего, 2 байта, а не 4, как предполагает ваш код.

Попробуйте использовать uint32_t вместо int, если можете.

...