Неожиданное шестнадцатеричное значение для числа с плавающей точкойC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неожиданное шестнадцатеричное значение для числа с плавающей точкой

Сообщение Anonymous »

Я обнаружил, что получаю неожиданные шестнадцатеричные значения, представляющие числа с плавающей запятой на процессоре ARM STM32H753. Я не могу определить, почему создаются эти шестнадцатеричные значения. Это число с плавающей запятой одинарной точности.
Вот упрощенный код:

Код: Выделить всё

#include 
#include 

int main() {
float setVal = 50000.0f;
uint32_t * val1 = (uint32_t *)((void *) (& setVal));
printf("Float into vSV: %x\r\n", * val1);
}
В реальном коде он запускается в ОСРВ, поэтому код немного сложнее и вместо printf использует другую функцию, называемую chprintf.
Код в основном предназначен для присвоения переменной значения (

Код: Выделить всё

50000.0f
), чтобы получить адрес, в конечном итоге привести к uint32_t, а затем распечатать 4 байта uint32_t.
Напечатанный результат — 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»