工作中,有时候有时候串口或者SPI要发送或者接受数据的时候,都会定义一个数组,一般直接都会定义一个unsigned char型的数组,但是没怎么想过为啥不定义一个char型的变量。直到前几天在用编译器测试float型转字符型变量的时候才发现好像确实是有些区别的,当时我是这么写的
#include <stdio.h>
#include <stdlib.h>
float sample=1.234;
union
{
char Byte[4];
float a;
}FloatTo4Bytes;
int main()
{
char i=0;
FloatTo4Bytes.a=sample;
for(i=0;i<4;i++)
{
printf("Byte%d=0X%X\r\n",i+1,FloatTo4Bytes.Byte[i]);
}
return 0;
}
然后运行结果就是这样的
看起来有点奇怪,Byte4是我希望看到的那个结果,但为什么前面几个变量前面都有个FFFFFF,当时也搜索了一下别人是否遇到了这个情况,答案是肯定的。这个原因是在于,编译器在使用printf的时候,会把这个char型变量转换为int型变量。而char型变量作为最高位为符号位,在这点上和unsigned char是有区别的。所以会出现上面的现象。
所以我得出了一个结论,底层下位机编程,就定义unsigned char就好了,虽然说当你不涉及转化的时候,两者都差不多,但是万一有功能需要进行强制转换,可能一不小心就出错了,到时候还要想是哪里出错的。就unsigned char就行,我看STM32 HAL库里好多对数据的操作,也一样都定义的unsigned char
文章评论