隱式轉換<一>

關於算術隱式轉換一直存在疑惑,今天來捋一捋思路!
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。

最後,隱式轉換部分差不多就寫了個算術運算類型的,以後遇到新的問題再來補充微笑!!!


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