在用C编写单片机的程序时,在采集处理数据时,总会出现一些不正常的数据。经过数次的排查,发现大部分的问题都出现在赋值时的类型转换问题上。C语言在赋值时的类型转换问题是很隐蔽的,经常性地会被忽略,而这又会导致致命性的错误。弄清楚C语言的类型转换的规则,至关重要!
C语言的类型转换分为隐式和显示转换(强制类型转换),它们都按照一定的规则进行转化的!
C语言中,在进行算术运算(加减乘除)或赋值运算(=)时,都是以补码的形式进行的!
低位向高位看齐:进行运算的双方的位数一定要对齐(位数相同),如果不同,则低字节数据类型要变成高字节数据类型!
类型转换规则
1.若运算符两边一个是长整形,一个是短整型,则计算机会先将短整型转化为长整形,然后再进行运算。
计算:(0000 0001) + (0000 0000 0000 0010)
(0000 0001)先转换为另一个比它占字节更多的类型(0000 0000 0000 0001)
然后再和(0000 0000 0000 0010)进行运算!
0000 0000 0000 0001
+ 0000 0000 0000 0010
目的:运算双方位数对齐。
2.若运算符两边一个是有符号整形,一个是无符号整型,则将有符号整形转化为无符号整型,然后再进行运算。
原因:无符号类型所能够表示的数据范围更广
赋值运算时类型转化的注意事项
1.赋值截取问题:赋值号左边为短整型(低字节数据类型),右边为长整形(高字节数据类型)时,短整型变量只能接受长整形数据的低字节部分,高字节部分会丢失。
short a;
unsigned long b;
b = 98304;
a = b;
print("%d",a);
输出结果:-32768
处理过程:b:0001 1000 0000 0000 0000 超过short的范围
则计算机会截取符合short范围部分的数据赋值给a(1000 0000 0000 0000),由于a接受到的数据是补
码类型的,所以要把它取反加一变成原码类型( 11111 1111 1111 1110:最高位是符号位),则a的结果
为-32768
2.当赋值号左边的变量为无符号整型,右边为有符号整型时,则把右边内容原样复制给左边的变量。
unsigned int a;
int b;
b = -1;
a = b;
print("%d",a);
结果是:a=65535;
处理过程:b=-1先变成补码形式:1111 1111 1111 1111
这个补码然后赋值给a,由于a是无符号类型,所以a的值是正数
所以a的值是65535