C++有符號和無符號之間的轉換
阿新 • • 發佈:2018-12-31
先來看一個程式:
#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正常列印我們都知道,但當一個有符號和一個無符號之間的數進行相加減會發生什麼呢?
是這樣的: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;
}
列印:4294967291
其過程是對運算後的結果-5取模
迴圈中的發現:
執行結果將是無限列印,原因是:當u=0時,仍能進去迴圈,然後u=-1了,由於u的型別是unsigned則被取模轉換了,則u總是大於0的,所以是無限迴圈。#include<iostream> int main() { unsigned u=5; while(u>=0) { --u; std::cout<<u<<std::endl; } return 0; }
此時應將while裡面的條件改成:u>0,當u=0時不能進去迴圈,u不是小於0也就沒有型別轉換,則迴圈能終止。