今天发现一个挺久以来一直没有留意的知识盲区,直接上代码:
#include <stdio.h>
int main () {
unsigned char a = 1;
unsigned short b = 0;
b = a << 8;/* a只有8位,按照运算符的优先级,先进行<<运算,左移以后a=0,然后赋值给b,b应该也等于0,不是吗? */
printf("b=%d\n",b);
return 0;
}
结果运行的时候,发现结果和想象的不一样,结果如下:
b=256
经过查找资料以后发现,这里涉及到自动类型转换的知识点。转换的规则如下:
(1) 当参与运算的数据的类型不同时,编译系统会自动先将它们转换成同一类型,然后再进行运算。转换的基本规则是“按数据长度增加的方向进行转换”,以保证精度不降低。比如nt 型数据和 long 型数据进行相加或相减运算时,系统会先将 int 型数据转换成 long型,然后再进行运算。这样的话运算结果的精度就不会降低。
(2)char 型和 short 型数据参与运算时,必须先转换成 int 型。
(3)在赋值运算中,当赋值号两边的数据类型不同时,右边的类型会转换为左边的类型,然后再赋给左边。如果右边数据类型的长度比左边长,那么将会丢失数据,这样就会降低精度,所以编译的时候会产生警告。
那这里就很明显了,u8和u16进行赋值运算的时候,先转换为u16类型的,所以b不是等于0,而是等于256.
以上的转换规则引用来源于下面的链接,关于更多的自动类型转换规则,可以参考以下链接进行学习,这篇文章讲解得更好。
http://c.biancheng.net/view/157.html