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



