У меня есть значение, которое я получаю в байтовом массиве без знака, который я хотел бы разыменовать как 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 вместо того, что я набрал.
Я в замешательстве — я что-то здесь упускаю?
В основном, дереф правильный.
если ты printf("%p", ptr);
Вы получаете адрес, который может быть не выровнен по 4 байта (или по крайней мере выровнен по 2 байта)? Это может быть необходимо на некоторых платформах.
Для теста просто передайте значение реального числа с плавающей точкой в uint8_t *, например,
float f= 102.5;
yourfunct((uint8_t*)&f);
и посмотрим, работает ли это.
*(float*)(ptr - 1);
такой же, как этот
ptr--; //move the pointer to point to charackter in front of the previous one
*(float*)ptr;
Это твое намерение?
Или вы просто хотите вычесть 1 из значения, которое указывается, чтобы быть ptr.