1. 程式人生 > >C++有符號和無符號之間的轉換

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正常列印我們都知道,但當一個有符號和一個無符號之間的數進行相加減會發生什麼呢?

是這樣的: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取模

迴圈中的發現:

#include<iostream>

int main()
{
     unsigned u=5;
     while(u>=0)
     {
          --u;
          std::cout<<u<<std::endl;
     }

     return 0;

}
執行結果將是無限列印,原因是:當u=0時,仍能進去迴圈,然後u=-1了,由於u的型別是unsigned則被取模轉換了,則u總是大於0的,所以是無限迴圈。

此時應將while裡面的條件改成:u>0,當u=0時不能進去迴圈,u不是小於0也就沒有型別轉換,則迴圈能終止。