您好,登錄后才能下訂單哦!
我們先來看下實例代碼:
#include <iostream> #include <string> using std::cin; using std::cout; using std::endl; using std::string; int main() { unsigned int a; int b = -1; while (cin >> a) { if (a > b) { cout << "a > b" << endl; } else if (a < b) { cout << "a < b" << endl; } else { cout << "a == b" << endl; } } return 0; }
解釋:
如果算術(shù)運算或關系運算的運算對象有多種類型,需要轉(zhuǎn)換成同一種類型。
這個涉及到無符號類型的運算對象:
如果某個運算符的運算對象不一致,這些運算對象將轉(zhuǎn)換成同一種類型。但是如果某個運算對象的類型是無符號類型,那么轉(zhuǎn)換的結(jié)果就要依賴機器中各個整數(shù)類型中各個整數(shù)類型的相對大小了。
像往常一樣,首先執(zhí)行整型提升。如果結(jié)果的類型匹配,無需進行進一步的轉(zhuǎn)換。如果兩個(提升后的)運算對象的類型要么都是帶符號的、要么都是無符號的,則小類型的運算對象轉(zhuǎn)換成較大的類型。
如果一個運算對象是無符號類型、另外一個運算對象是帶符號類型,而且其中的無符號類型不小于帶符號類型,那么帶符號的運算對象轉(zhuǎn)換成無符號的。如上面的程序中的unsigned int和int,則int類型的運算對象轉(zhuǎn)換成unsigned int類型。如果int型的值恰好為負值,則轉(zhuǎn)換為unsigned int的數(shù)值總數(shù)去模后的余數(shù)。也就造成了a < b的奇怪情況。
例如,8比特大小的unsigned char可以表示0至255區(qū)間內(nèi)的值,如果我們賦了一個區(qū)間以外的值,則實際的結(jié)果是該值對256取模后所得的余數(shù)。因此把-1賦給8比特大小的unsigned char所得的結(jié)果是255。
剩下的一種情況是帶符號類型大于無符號類型,此時轉(zhuǎn)換的結(jié)果依賴于機器,如果無符號類型的所有值都能存在在該帶符號類型中,則無符號類型的運算對象轉(zhuǎn)換成帶符號類型。如果不能,那么帶符號類型的運算對象轉(zhuǎn)換成無符號類型。
到此這篇關于C++隱式轉(zhuǎn)換問題分析及解決辦法的文章就介紹到這了,更多相關C++中發(fā)現(xiàn)的隱式轉(zhuǎn)換問題內(nèi)容請搜索億速云以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。