首页
登录 | 注册

C语言之赋值运算中类型转换的陷阱!

 

    在用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

 



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.008 s.
京ICP备10005923号