C++有符號(hào)和無(wú)符號(hào)之間的轉(zhuǎn)換問(wèn)題
先來(lái)看一個(gè)程序:
#include<iostream> int main() { unsigned a=5; int b=-10; std::cout<<b+b<<std::endl;//正常輸出 std::cout<<a+b<<std::endl; return 0; }
打?。?20
4294967291
-20正常打印我們都知道,但當(dāng)一個(gè)有符號(hào)和一個(gè)無(wú)符號(hào)之間的數(shù)進(jìn)行相加減會(huì)發(fā)生什么呢?
是這樣的:a+b,首先把負(fù)數(shù)轉(zhuǎn)換為無(wú)符號(hào)數(shù),然后在進(jìn)行運(yùn)算。
b轉(zhuǎn)換為無(wú)符號(hào)數(shù)就是對(duì)b取模,2^32+b,結(jié)果為4294967286。
再看:
#include<iostream> int main() { unsigned a=10,b=5; std::cout<<b-a<<std::endl; return 0; }
打?。?294967291
其過(guò)程是對(duì)運(yùn)算后的結(jié)果-5取模
循環(huán)中的發(fā)現(xiàn):
#include<iostream> int main() { unsigned u=5; while(u>=0) { --u; std::cout<<u<<std::endl; } return 0; }
運(yùn)行結(jié)果將是無(wú)限打印,原因是:當(dāng)u=0時(shí),仍能進(jìn)去循環(huán),然后u=-1了,由于u的類型是unsigned則被取模轉(zhuǎn)換了,則u總是大于0的,所以是無(wú)限循環(huán)。
此時(shí)應(yīng)將while里面的條件改成:u>0,當(dāng)u=0時(shí)不能進(jìn)去循環(huán),u不是小于0也就沒(méi)有類型轉(zhuǎn)換,則循環(huán)能終止。
到此這篇關(guān)于C++有符號(hào)和無(wú)符號(hào)之間的轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)c++有符號(hào)無(wú)符號(hào)轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語(yǔ)言中用位運(yùn)算實(shí)現(xiàn)加法技巧介紹
用位運(yùn)算實(shí)現(xiàn)加法也就是計(jì)算機(jī)用二進(jìn)制進(jìn)行運(yùn)算,32位的CPU只能表示32位內(nèi)的數(shù),這里先用1位數(shù)的加法來(lái)進(jìn)行,需要的朋友可以參考下2012-11-11VS中動(dòng)態(tài)庫(kù)的創(chuàng)建和調(diào)用方式詳解
庫(kù)的存在形式本質(zhì)上來(lái)說(shuō)庫(kù)是一種可執(zhí)行代碼的二進(jìn)制,? 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別主要是在鏈接階段處理庫(kù)的方式不同而區(qū)分的,本文介紹VS中動(dòng)態(tài)庫(kù)的創(chuàng)建和調(diào)用方式,感興趣的朋友一起看看吧2024-01-01關(guān)于c語(yǔ)言逗號(hào)表達(dá)式的運(yùn)算規(guī)則知識(shí)點(diǎn)
在本篇文章里小編給大家整理的是關(guān)于c語(yǔ)言逗號(hào)表達(dá)式的運(yùn)算規(guī)則知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)參考下。2020-03-03C++ OpenCV模擬實(shí)現(xiàn)微信跳一跳
這篇文章主要介紹了使用C++和OpenCV模擬實(shí)現(xiàn)微信跳一跳功能,本文圖文并茂通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12