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

