隐式转换<一>

关于算术隐式转换一直存在疑惑,今天来捋一捋思路!
1,关于无符号和有符号数的比较
贴一段代码:
#include<iostream>
using namespace std;

int main(){
    unsigned int a = 20;
    signed int b = -10;
    signed int c = -20;
    unsigned int d = -30;
    if (a > b)
        cout << a << endl;
    else{
        cout << a + b << endl;
        cout << a + c << endl;
        cout << a + d << endl;    
    }
    return 0;
}

输出结果为:

10
0
4294967286


疑点:可是明明是10大于-10哇!!!
解答:在C++语言中,当表达式中存在有符号类型和无符号类型的时候,所有的操作数都会自动转换为无符号类型,因此在进行有符号类型和无符号类型数据比较的时候,编译器自动转换为无符号数。在代码中有三个测试用例,显示了计算机的运算结果。(不是特别了解???)
2,一些小结(选自网上)
a、所有比int型小的数据类型(包括char,signed char,unsigned char,short,signed short,unsigned short)转换为int型。如果转换后的数据会超出int型所能表示的范围的话,则转换为unsigned int型;
b、bool型转化为int型时,false转化为0,true转换为1;反过来所有的整数类型转化为bool时,0转化为false,其它非零值都转为true;
c、如果表达式中混有unsigned short和int型时,如果int型数据可以表示所有的unsigned short型的话,则将unsigned short类型的数据转换为int型,否则,unsigned short类型及int型都转换为unsigned int类型。举个例子,在32位机上,int是32位,范围–2,147,483,648 to 2,147,483,647,unsigned short是16位,范围0 to 65,535,这样int型的足够表示unsigned short类型的数据,因此在混有这两者的运算中,unsigned short类型数据被转换为int型;
d、unsigned int 与long类型的转换规律同c,在32位机上,unsigned int是32位,范围0 to 4,294,967,295,long是32位,范围–2,147,483,648 to 2,147,483,647,可见long类型不够表示所有的unsigned int型,因此在混有unsigned int及long的表达式中,两者都被转换为unsigned long;
e、如果表达式中既有int 又有unsigned int,则所有的int数据都被转化为unsigned int类型。
3,微软面试题
#include<iostream>
using namespace std;

int main(){
	unsigned int i = 3;
	unsigned int a;
	a = i*-1;
	int b;
	b = i*-1;
	cout << i * -1 << endl;
	cout << a << endl;
	cout << b << endl;
	return 0;
}

输出结果为:

4294967293
4294967293
-3


解惑:在表达式i*-1中,i是unsigned int型,-1是int型(常量整数的类型同enum),按第e条可以知道-1必须转换为unsigned int型,即0xffffffff,十进制的4294967295,然后再与i相乘,即4294967295*3,如果不考虑溢出的话,结果是12884901885,十六进制0x2FFFFFFFD,由于unsigned int只能表示32位,因此结果是0xfffffffd,即4294967293。

最后,隐式转换部分差不多就写了个算术运算类型的,以后遇到新的问题再来补充微笑!!!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章