C++有符號和無符號之間的轉(zhuǎn)換問題
先來看一個程序:
#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)一個有符號和一個無符號之間的數(shù)進(jìn)行相加減會發(fā)生什么呢?
是這樣的:a+b,首先把負(fù)數(shù)轉(zhuǎn)換為無符號數(shù),然后在進(jìn)行運算。
b轉(zhuǎn)換為無符號數(shù)就是對b取模,2^32+b,結(jié)果為4294967286。
再看:
#include<iostream> int main() { unsigned a=10,b=5; std::cout<<b-a<<std::endl; return 0; }
打?。?294967291
其過程是對運算后的結(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; }
運行結(jié)果將是無限打印,原因是:當(dāng)u=0時,仍能進(jìn)去循環(huán),然后u=-1了,由于u的類型是unsigned則被取模轉(zhuǎn)換了,則u總是大于0的,所以是無限循環(huán)。
此時應(yīng)將while里面的條件改成:u>0,當(dāng)u=0時不能進(jìn)去循環(huán),u不是小于0也就沒有類型轉(zhuǎn)換,則循環(huán)能終止。
到此這篇關(guān)于C++有符號和無符號之間的轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)c++有符號無符號轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS中動態(tài)庫的創(chuàng)建和調(diào)用方式詳解
庫的存在形式本質(zhì)上來說庫是一種可執(zhí)行代碼的二進(jìn)制,? 靜態(tài)庫和動態(tài)庫的區(qū)別主要是在鏈接階段處理庫的方式不同而區(qū)分的,本文介紹VS中動態(tài)庫的創(chuàng)建和調(diào)用方式,感興趣的朋友一起看看吧2024-01-01關(guān)于c語言逗號表達(dá)式的運算規(guī)則知識點
在本篇文章里小編給大家整理的是關(guān)于c語言逗號表達(dá)式的運算規(guī)則知識點,需要的朋友們可以學(xué)習(xí)參考下。2020-03-03