|
发表于 2011-4-16 07:58:40
|
显示全部楼层
记住(标准C规则):
1.char,usnigned char,signed char本质上没有逻辑,算术运算,char,usnigned char,signed char本质上并不能直接参与运算。
2.所有的算术与逻辑操作符,都要求操作数至少是int。
3.char,usnigned char,signed char参与运算,实际上是把char,usnigned char,signed char先转换成int,或者unsigned int,再再与运算。(C标准里面,这个规则叫整型提升)。
4.C语言所有字面值整型常量,都有自己的类型,而且至少为int。
实际上,绝大大部分编译器,都是遵守上边的规则的。
举例:
1.if (0!=(~0xFF))
0,0xff,不要错误地认为0,0xff的类型是unsigned char,或者没有类型。
实际上所有字面值整型常量,都有自己的类型,这里为int。
2.if (0!=(~(unsigned char)0xFF))
不要错误地认为~unsigned char结果还是unsigned char。
实际上,unsigned char并不能直接进行~运算,需要先提升至int才能运算。
而且~运算符也要有操作数必须至少是int。
这个unsigned char转换没用,因为char参与运算,总是会被提升,至少为int。
3.long a=10*10000; (假定int是16位)
不要错误地认为,a的结果是100000,实际上结果为-31072
原因C语言所有字面值整型常量,都有自己的类型,而且至少为int,这里10和10000都是int型,
而int与int相乘,结果还是int,如果有益出,溢出会被丢弃。10*10000结果为-31072。 |
|