Разыменование указателя в Code Composer Studio

У меня есть значение, которое я получаю в байтовом массиве без знака, который я хотел бы разыменовать как float. Возьмите ptr как uint8_t *, указывающий на байтовый массив из четырех значений 0,0,0xCD, 0x42 (это система с прямым порядком байтов).

float val = *(float*)ptr;

это возврат -1.34e8

Когда я печатаю:

*(float*)ptr;

В окне выражений после достижения точки останова в этом разделе кода он дает мне 102,5, как и ожидалось. Далее, когда я печатаю:

*(float*)(ptr - 1);

Я получаю неправильное значение -1.34e8, как если бы компилятор использовал ptr — 1 вместо того, что я набрал.

Я в замешательстве — я что-то здесь упускаю?

1

Решение

В основном, дереф правильный.

если ты printf("%p", ptr); Вы получаете адрес, который может быть не выровнен по 4 байта (или по крайней мере выровнен по 2 байта)? Это может быть необходимо на некоторых платформах.

Для теста просто передайте значение реального числа с плавающей точкой в ​​uint8_t *, например,

float f= 102.5;
yourfunct((uint8_t*)&f);

и посмотрим, работает ли это.

3

Другие решения

*(float*)(ptr - 1);

такой же, как этот

ptr--; //move the pointer to point to charackter in front of the previous one
*(float*)ptr;

Это твое намерение?
Или вы просто хотите вычесть 1 из значения, которое указывается, чтобы быть ptr.

0