Вот упрощенный код:
Код: Выделить всё
#include
#include
int main() {
float setVal = 50000.0f;
uint32_t * val1 = (uint32_t *)((void *) (& setVal));
printf("Float into vSV: %x\r\n", * val1);
}
Код в основном предназначен для присвоения переменной значения (
Код: Выделить всё
50000.0fНапечатанный результат — 40E86A00. Однако я ожидаю, что будет напечатано 47435000. Я ожидаю, что это значение основано на использовании https://gregstoll.com/~gregstoll/floattohex/ для преобразования 50000,0 в шестнадцатеричное значение.
У меня также есть некоторый библиотечный код, который отправляет число с плавающей запятой через UART. Данные, передаваемые по UART, также имеют вид 40E86A00 (но с измененным порядком байтов из-за порядка байтов).
Если я запускаю этот код на ПК с Linux на базе Intel, результат будет 47435000, что соответствует моим ожиданиям.
Что мне не хватает?
Дополнения к исходному вопросу
Использование uint32_t val1; memcpy(&val1, &setVal, 4); printf("%x\n", val1); от @SteveSummit я получаю ожидаемые 47435000. Однако это не объясняет библиотечную функцию, создающую значение, которое эффективно отправляет данные в UART.
Вот пример начала одного из вызовов компилятора: Arm-none-eabi-gcc -c -mcpu=cortex-m7 -mthumb -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -Wall -Wextra -Wundef -Wstrict-prototypes -Wa,-alms=./build/lst/crt1.lst -DCORTEX_USE_FPU=FALSE -DSTM32_ENFORCE_H7_REV_XY -MD -MP -MF
Вот информация о номере версии компилятора: Arm-none-eabi-gcc (Arm GNU Toolchain 11.3.Rel1) 11.3.1 20220712 и Arm-none-eabi-g++ (Arm GNU Toolchain) 11.3.Rel1) 11.3.1 20220712
Подробнее здесь: https://stackoverflow.com/questions/798 ... -for-float
Мобильная версия