最近在项目中,需要处理下位机传回的四字节数据,低字节在前,高字节在后,每四个字节组成一个样本数据。
因为后面还需要做某些算法转换需要用到double类型处理,所以在字节处理时,偷懒选择了直接转化为double,然后就导致收到的
样本数据进行转化后,遇到负值就错误,而且一个负数也没有,下面记录下原因,当做总结。
测试程序:
int main()
{
//高-低 4294967295
printf("FFFFFFFF ---- 4294967295\n");
char buf[4] = {0xFF,0x34,0x5E,0x4A};
int data = buf[0]<<24&0xFF000000|buf[1]<<16&0xFF0000|buf[2]<<8&0xFF00|buf[3]&0xFF;
printf("int值 = %d \n",data);
double data1 = buf[0]<<24&0xFF000000|buf[1]<<16&0xFF0000|buf[2]<<8&0xFF00|buf[3]&0xFF;
printf("double值 = %lf \n",data1);
//int 4个字节当最高位出现FF时 ,符号位为1表示为负数,此时int的取值转化为负数
//当为double时,为8个字节,第四位的FF并不会影响double的符号位 所以double取值仍为正。
printf("float = %d\n",sizeof(float));
printf("double = %d\n",sizeof(double));
getchar();
return 0;
}
运行结果:
原因在代码中基本解释清楚了。这种低级错误本是不应该犯的,记录一下,当做教训。