C++隱式轉(zhuǎn)換問(wèn)題分析及解決辦法
我們先來(lái)看下實(shí)例代碼:
#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ù)運(yùn)算或關(guān)系運(yùn)算的運(yùn)算對(duì)象有多種類型,需要轉(zhuǎn)換成同一種類型。
這個(gè)涉及到無(wú)符號(hào)類型的運(yùn)算對(duì)象:
如果某個(gè)運(yùn)算符的運(yùn)算對(duì)象不一致,這些運(yùn)算對(duì)象將轉(zhuǎn)換成同一種類型。但是如果某個(gè)運(yùn)算對(duì)象的類型是無(wú)符號(hào)類型,那么轉(zhuǎn)換的結(jié)果就要依賴機(jī)器中各個(gè)整數(shù)類型中各個(gè)整數(shù)類型的相對(duì)大小了。
像往常一樣,首先執(zhí)行整型提升。如果結(jié)果的類型匹配,無(wú)需進(jìn)行進(jìn)一步的轉(zhuǎn)換。如果兩個(gè)(提升后的)運(yùn)算對(duì)象的類型要么都是帶符號(hào)的、要么都是無(wú)符號(hào)的,則小類型的運(yùn)算對(duì)象轉(zhuǎn)換成較大的類型。
如果一個(gè)運(yùn)算對(duì)象是無(wú)符號(hào)類型、另外一個(gè)運(yùn)算對(duì)象是帶符號(hào)類型,而且其中的無(wú)符號(hào)類型不小于帶符號(hào)類型,那么帶符號(hào)的運(yùn)算對(duì)象轉(zhuǎn)換成無(wú)符號(hào)的。如上面的程序中的unsigned int和int,則int類型的運(yùn)算對(duì)象轉(zhuǎn)換成unsigned int類型。如果int型的值恰好為負(fù)值,則轉(zhuǎn)換為unsigned int的數(shù)值總數(shù)去模后的余數(shù)。也就造成了a < b的奇怪情況。
例如,8比特大小的unsigned char可以表示0至255區(qū)間內(nèi)的值,如果我們賦了一個(gè)區(qū)間以外的值,則實(shí)際的結(jié)果是該值對(duì)256取模后所得的余數(shù)。因此把-1賦給8比特大小的unsigned char所得的結(jié)果是255。
剩下的一種情況是帶符號(hào)類型大于無(wú)符號(hào)類型,此時(shí)轉(zhuǎn)換的結(jié)果依賴于機(jī)器,如果無(wú)符號(hào)類型的所有值都能存在在該帶符號(hào)類型中,則無(wú)符號(hào)類型的運(yùn)算對(duì)象轉(zhuǎn)換成帶符號(hào)類型。如果不能,那么帶符號(hào)類型的運(yùn)算對(duì)象轉(zhuǎn)換成無(wú)符號(hào)類型。
到此這篇關(guān)于C++隱式轉(zhuǎn)換問(wèn)題分析及解決辦法的文章就介紹到這了,更多相關(guān)C++中發(fā)現(xiàn)的隱式轉(zhuǎn)換問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Boost.Range與Adapters庫(kù)使用詳解
這篇文章主要介紹了C++ Boost.Range與Adapters庫(kù)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-11-11
C++入門之vector的底層實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了C++入門之vector的底層實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-11-11
C語(yǔ)言如何利用ASCII碼表統(tǒng)計(jì)字符串每個(gè)字符出現(xiàn)的次數(shù)
這篇文章主要介紹了C語(yǔ)言如何利用ASCII碼表統(tǒng)計(jì)字符串每個(gè)字符出現(xiàn)的次數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)鏈表隊(duì)列的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)鏈表隊(duì)列的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

