關於算術隱式轉換一直存在疑惑,今天來捋一捋思路!
1,關於無符號和有符號數的比較
貼一段代碼:
輸出結果爲:
10
0
4294967286
疑點:可是明明是10大於-10哇!!!
解答:在C++語言中,當表達式中存在有符號類型和無符號類型的時候,所有的操作數都會自動轉換爲無符號類型,因此在進行有符號類型和無符號類型數據比較的時候,編譯器自動轉換爲無符號數。在代碼中有三個測試用例,顯示了計算機的運算結果。(不是特別瞭解???)
2,一些小結(選自網上)
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,微軟面試題
輸出結果爲:
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。
最後,隱式轉換部分差不多就寫了個算術運算類型的,以後遇到新的問題再來補充!!!
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。
最後,隱式轉換部分差不多就寫了個算術運算類型的,以後遇到新的問題再來補充!!!