C++溢位
每一個東西都有他的極限,程式內根據變數宣告型態不同,也有它不同的範圍;溢位是指他超過了範圍,一旦超過,就會重新來過最初的樣子。
(有正負號)
short 2 bytes -32767 to +32767
int、long 4 bytes -2147483648 to +2147483647
char 1 bytes -128 to 127
long long 8 bytes 9223372036854775807 to -9223372036854775807
(無正負號)
unsigned short 2 bytes 0 to 65535
unsigned char 1 bytes 0 to 255
unsigned int、long 4 bytes 0 to 4294967295
unsigned long long 8 bytes 0 to 18446744073709551615
(浮點數)
單倍精確度 float 4 bytes -3.4E+38 to 3.4E+38
雙倍精確度 double 8 bytes -1.79E+308 to 1.79E+308
範例:
- short i=32767;
- cout << "溢位前:" << i << endl;
- i += 1;
- cout << "溢位後:" << i << endl;
注意:用printf要輸出無正負號整數,需使用%u格式
如果將short 改成 unsigned short 或 int 就不會有問題
但是要怎麼判斷有無OVERFLLOW溢位呢?
我以整數為例子:
- int main()
- {
- int i;
- int j;
- cout<<"input int1:";
- cin>> i;
- cin >> j;
- addint(i,j);
- }
- void addint(int a,int b)
- {
- if(a > 0 && b > 0 && INT_MAX+b < 0) cout<<"overfollow="<<a+b<<endl;
- else if(a < 0 && b < 0 && INT_MIN+b > 0) cout<<"overfollow="<<a+b<<endl;
- else cout << a+b << endl;
- }
INT_MAX和INT_MIN是啥阿?
顧名思義,就是INT的範圍最大和最小值,也有其他的~~
我都列出來吧
- int main()
- {
- cout << "有正負號"<<endl;
- cout<<"INT_MAX:"<<INT_MAX<<endl;
- cout<<"INT_MIN:"<<INT_MIN<<endl;
- cout<<"LONG_MAX:"<<LONG_MAX<<endl;
- cout<<"LONG_MIN:"<<LONG_MIN<<endl;
- cout<<"CHAR_MAX:"<<CHAR_MAX<<endl;
- cout<<"CHAR_MIN:"<<CHAR_MIN<<endl;
- cout<<"LONG_LONG_MAX:"<<LONG_LONG_MAX<<endl;
- cout<<"LONG_LONG_MIN:"<<LONG_LONG_MIN<<endl;
-
- cout<<"無正負號:"<<endl;
- cout<<"UINT_MAX:"<<UINT_MAX<<endl;
- cout<<"ULONG_MAX:"<<ULONG_MAX<<endl;
- cout<<"UCHAR_MAX:"<<UCHAR_MAX<<endl;
- cout<<"ULLONG_MAX:"<<ULLONG_MAX<<endl;
- }
這章重點純粹要讓讀者記得他們的範圍,避免程式出現奇怪的答案,在加上比賽有時範圍比較大,想說明明答案對,但怎麼還是都紅的或是沒全對,問題可能在這裡。
留言列表