無符號數字與負數(程式設計細節)
阿新 • • 發佈:2019-02-13
首先執行一段程式,結果出現之前可以預測一下結果哦!
#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);
這裡的-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 。