我使用0x40, 0x7E, 0xA7, 0xF2
将以下4个字节float
复制到memcpy
变量。现在我的c编译器为float
保留了4个字节,因此我复制到它的4个字节不应该导致溢出。
我的“当前”输出是 -2147483648-2147483648.-2147483648 mA 。
值 -2147483648 似乎表明缓冲区溢出。我不确定为什么它给了我这个价值。这是一个编译的例子:
#include <stdio.h>
#include <string.h>
typedef struct {
float current;
} hart_value_t;
hart_value_t hart_values;
unsigned char buf[4] = { 0x40, 0x7E, 0xA7, 0xF2 };
void spltfp(double value, int * intpart, int * decpart)
{
int i;
double dec;
i = (int)value;
printf("What value do I get here: %d", i);
dec = value - i;
if (dec < 0) {
dec = -dec;
}
*intpart = i;
*decpart = (int)(dec * 100);
}
void hartBufferReadFloat(unsigned char * buf, float * data)
{
printf("What is the size of float: %lu", sizeof(float)); // returns 4
memcpy(data, buf, 4); /* 0x40, 0x7E, 0xA7, 0xF2 */
}
void hartPrintFloat(float val)
{
int intpart, decpart;
spltfp(val, &intpart, &decpart);
printf("%d.%02d", intpart, decpart);
}
int main(void)
{
hartBufferReadFloat(buf, &hart_values.current);
printf("Current: "); hartPrintFloat(hart_values.current); printf(" mA\n");
return 0;
}
答案 0 :(得分:4)
对于big-endian系统,你有值0x40,0x7e,0xa7,0xf2,但你的系统是little-endian。他们需要逆转。
直接访问表示对象的字节通常不能在不同系统之间移植。字节在表示中出现的顺序只是可能出现的差异之一。
答案 1 :(得分:-1)
float有自己的格式,其中并非所有类似int的32位值都有效。查看IEEE 754