C++有符號和無符號之間的轉換問題
先來看一個程序:
#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正常打印我們都知道,但當一個有符號和一個無符號之間的數進行相加減會發(fā)生什么呢?
是這樣的:a+b,首先把負數轉換為無符號數,然后在進行運算。
b轉換為無符號數就是對b取模,2^32+b,結果為4294967286。
再看:
#include<iostream>
int main()
{
unsigned a=10,b=5;
std::cout<<b-a<<std::endl;
return 0;
}
打?。?294967291
其過程是對運算后的結果-5取模
循環(huán)中的發(fā)現:
#include<iostream>
int main()
{
unsigned u=5;
while(u>=0)
{
--u;
std::cout<<u<<std::endl;
}
return 0;
}
運行結果將是無限打印,原因是:當u=0時,仍能進去循環(huán),然后u=-1了,由于u的類型是unsigned則被取模轉換了,則u總是大于0的,所以是無限循環(huán)。
此時應將while里面的條件改成:u>0,當u=0時不能進去循環(huán),u不是小于0也就沒有類型轉換,則循環(huán)能終止。
到此這篇關于C++有符號和無符號之間的轉換的文章就介紹到這了,更多相關c++有符號無符號轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程
這篇文章主要介紹了Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
c語言之char*和unsigned?char*的區(qū)別及說明
這篇文章主要介紹了c語言之char*和unsigned?char*的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

