1. 程式人生 > >無符號數字與負數(程式設計細節)

無符號數字與負數(程式設計細節)

首先執行一段程式,結果出現之前可以預測一下結果哦!

#include <iostream>  
#include <string.h>  
using namespace std;  

int main()  
{  
    if(strlen("abc") < -1)  
    {  
        cout << strlen("abc")<<"    yes1" << endl;
    }  
    else  
    {  
        cout << "no1" << endl;  
    }  

    if
(sizeof("abc") < -1) { cout << sizeof("abc")<<" yes2" << endl; } else { cout << "no2" << endl; } if(string("abc").size() < -1) { cout << string("abc").size()<<" yes3" << endl; } else
{ cout << "no3" << endl; } return 0; }

—————————————————————分割線——————————————————————————————-
這是執行的結果:

3   yes1
4   yes2
3   yes3

3明顯是大於-1 的,,那為什麼會輸出yes呢??
因為std::size_t strlen( const char* str );它的返回型別是std::size_t。
再看size_t等同於什麼型別:
這裡寫圖片描述
這裡說他類似與unsigned int 型別。在32位的系統中他相當於unsigned int 佔有4個位元組,,但是在64位作業系統下,它相當於unsigned long 佔有8個位元組,所以有可能它的值比Int大。。。
一般不要使用int lenght = strlen(string_a);

這樣的語句,他可能會超出int 範圍,,當然應該也沒人會一下輸入那麼長的字串。
這裡的-1 會被 轉化為一個很大的無符號數字,

    int a =-1;
    unsigned int b =a;
    cout<<b<<endl;

使用上面的程式碼測試一下:

b = 4294967295

2的32次方就是4294967296,,故-1就是2的32次方減去1 。
一個32位的負數值是-N,那麼轉化成unsigned的值是2^32 - N 。