您的位置:首页 > 编程语言 > C语言/C++

C语言运算中的数据类型自动转换原则

2013-08-28 11:54 381 查看
C语言运算中的数据类型自动转换原则
问题1:
unsigned int a=20;
signed int b=-130;
a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?
问题2:
signed int b=-130;
std::cout<<b+30<<std::endl;
输出为-100。
问题3:
unsigned int i=3;
cout<<i * -1;
第一反应:-3。不过结果似乎不是这样的,写了个程序,运行了一下,发现是:4294967293。
问题4:
unsigned int a = 1;
int b = -10;
printf("%d\n",a+b); 运行结果为-9
unsigned int a = 1;
int b = -10;
printf("f\n",a+b); //cout<<setprecision(15)<< (double)(a+b)<<endl;
运行结果为0.0000(不知道为什么) //4294967287
——————————————————————————————————————————
以上四个问题涉及到c语言中的整数自动转换原则(见最后的知识备份),复习该知识点后,对以上4个问题的解答如下:
问题1:unsigned int a 与 int b的比较,在比较之前编译器会自动转化为unsigned int 进行,因此 a为20,b为4294967166,因此b>a
问题2:int b与常数30进行运算的结果,30默认为int,即int+int=int,结果仍为int
问题3:uint i与常数-1运算,结果转化为uint。另外,又做了测试:unsigned short b = 3;cout << (b>-1)<<endl;该情况下,unsigned short与int运算,b被转为为int,因此输出为1.
问题4:a与b运算,结果要转化为uint,但由于printf输出为%d,相当于强制转化为了int型。
写到这里,我发现一个问题,即运算时,究竟是先转化类型再计算,还是先计算结果再在赋值的过程中转化类型。在比较运算中,毫无疑问是先转化类型再比较;那么在加减运算中呢?那么问题4回答了这样一个问题:若先转再算:相当于计算(int)(1+4294967286) = -9若先算再转:相当于计算(int)(1-10)=-9单凭此无法区分,但将输出格式改为double,则(double)(1+4294967286)=4294967287,而(double)(1-10)=-9;由答案可见,是先转换类型再进行计算。——————————————————————————————————————————测试:执行:x = 100 + 'a' + 1.5 * u + f / 'b' - s * 3.1415926其中,u为unsigned型,f为float型,s为short型,x为float型。式中右面表达式按如下步骤处理:1、首先将'a'、'b'和s换成int,将1.5和f转换为double型。2、计算100+'a',因'a'已转换为int型,于是此运算结果为197。3、计算1.5*u,由于1.5已转换为double,u是unsigned型,于是首先u转换为double,然后进行运算,运算结果为double。4、计算197+1.5 * u,先将197转换为double(如197.00…00),其结果为double。5、计算f/ 'b',f已转换为double,'b'已转换为int,于是先将'b'再转换为double,其结果为double。6、计算(197+1.5 * u)+f / 'b',者均为double,于是结果也为double。7、计算s * 3.1415926,先将s由int转换为double,然后进行运算,其结果为double。8、最后与前面得的结果相减,结果为double。9、最后将表达式的结果转换为float并赋给x。——————————————————————————————————————————所用知识备份:1、隐式转换C在以下四种情况下会进行隐式转换:1、算术运算式中,低类型能够转换为高类型。2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。
2、算数运算的隐式转换算数运算中,首先有如下类型转换规则:1、字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。2、short型转换为int型(同属于整型) 。3、float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型) 。其次,有下面的规则。当不同类型的数据进行操作时,应当首先将其转换成相同的数据类型,然后进行操作,转换规则是由低级向高级转换。转换规则如下图所示
C语言运算中的数据类型自动转换原则问题1:unsigned int a=20;signed int b=-130;a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?问题2:signed int b=-130;std::cout<<b+30<<std::endl;输出为-100。问题3:unsigned int i=3;cout<<i * -1;第一反应:-3。不过结果似乎不是这样的,写了个程序,运行了一下,发现是:4294967293。问题4:unsigned int a = 1;
int b = -10;
printf("%d\n",a+b); 运行结果为-9
unsigned int a = 1;
int b = -10;
printf("f\n",a+b); //cout<<setprecision(15)<< (double)(a+b)<<endl;
运行结果为0.0000(不知道为什么) //4294967287
——————————————————————————————————————————以上四个问题涉及到c语言中的整数自动转换原则(见最后的知识备份),复习该知识点后,对以上4个问题的解答如下:
问题1:unsigned int a 与 int b的比较,在比较之前编译器会自动转化为unsigned int 进行,因此 a为20,b为4294967166,因此b>a问题2:int b与常数30进行运算的结果,30默认为int,即int+int=int,结果仍为int问题3:uint i与常数-1运算,结果转化为uint。另外,又做了测试:unsigned short b = 3;cout << (b>-1)<<endl;该情况下,unsigned short与int运算,b被转为为int,因此输出为1.问题4:a与b运算,结果要转化为uint,但由于printf输出为%d,相当于强制转化为了int型。写到这里,我发现一个问题,即运算时,究竟是先转化类型再计算,还是先计算结果再在赋值的过程中转化类型。在比较运算中,毫无疑问是先转化类型再比较;那么在加减运算中呢?那么问题4回答了这样一个问题:若先转再算:相当于计算(int)(1+4294967286) = -9若先算再转:相当于计算(int)(1-10)=-9单凭此无法区分,但将输出格式改为double,则(double)(1+4294967286)=4294967287,而(double)(1-10)=-9;由答案可见,是先转换类型再进行计算。——————————————————————————————————————————测试:执行:x = 100 + 'a' + 1.5 * u + f / 'b' - s * 3.1415926其中,u为unsigned型,f为float型,s为short型,x为float型。式中右面表达式按如下步骤处理:1、首先将'a'、'b'和s换成int,将1.5和f转换为double型。2、计算100+'a',因'a'已转换为int型,于是此运算结果为197。3、计算1.5*u,由于1.5已转换为double,u是unsigned型,于是首先u转换为double,然后进行运算,运算结果为double。4、计算197+1.5 * u,先将197转换为double(如197.00…00),其结果为double。5、计算f/ 'b',f已转换为double,'b'已转换为int,于是先将'b'再转换为double,其结果为double。6、计算(197+1.5 * u)+f / 'b',者均为double,于是结果也为double。7、计算s * 3.1415926,先将s由int转换为double,然后进行运算,其结果为double。8、最后与前面得的结果相减,结果为double。9、最后将表达式的结果转换为float并赋给x。——————————————————————————————————————————所用知识备份:1、隐式转换C在以下四种情况下会进行隐式转换:1、算术运算式中,低类型能够转换为高类型。2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。2、算数运算的隐式转换算数运算中,首先有如下类型转换规则:1、字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。2、short型转换为int型(同属于整型) 。3、float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型) 。其次,有下面的规则。当不同类型的数据进行操作时,应当首先将其转换成相同的数据类型,然后进行操作,转换规则是由低级向高级转换。转换规则如下图所示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C c语言 类型转换