由低级向高级转换的原则
最近几天参加一公司招聘,其中有一道笔试题是这样的:
如下程序的输出结果是?
#include<stdio.h>
int main()
{
unsigned int a=6;
int b=-20;
(a+b>6)?printf(">6"):printf("<=6");
system("pause");
return 0;
}
正确答案是:
至于原因就是上面所讲的规则,b先变为unsigned型。学过计算机基础的都知道,负数是以补码的形式存在计算机中的,所以int 型的b在内存中的值为0xffffffec(vc6.0中int型为32位),化为十进制数即为4294967276,a+b=4294967276+6=4294967282
在实际调试中也是这个值
从这个意义来说,无符号数的运算优先级要高于有符号数,式子中如果有unsigned型,则所有变量都要先变为unsigned型再运算。
补充一点,c语言在下面几种情况都发生自动类型转换:
1、算术运算式中,低类型能够转换为高类型。
2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。