close
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
範例:
  1. short i=32767;    
  2. cout << "溢位前:" << i << endl;    
  3. i += 1;    
  4. cout << "溢位後:" << i << endl;   
  •  
注意:用printf要輸出無正負號整數,需使用%u格式
如果將short 改成 unsigned short 或 int 就不會有問題
 
但是要怎麼判斷有無OVERFLLOW溢位呢?
我以整數為例子:
  1. int main()  
  2. {  
  3.   int i;  
  4.   int j;  
  5.   cout<<"input int1:"//輸入2147483647  
  6.   cin>> i;  
  7.   cin >> j;  
  8.   addint(i,j);  
  9. }  
  10. void addint(int a,int b)  
  11. {  
  12.     if(a > 0 && b > 0 && INT_MAX+b < 0) cout<<"overfollow="<<a+b<<endl;  
  13.     else if(a < 0 && b < 0 && INT_MIN+b > 0) cout<<"overfollow="<<a+b<<endl;  
  14.     else cout << a+b << endl;  
  15. }
 
INT_MAX和INT_MIN是啥阿?
顧名思義,就是INT的範圍最大和最小值,也有其他的~~
我都列出來吧
  1. int main()  
  2. {  
  3.   cout << "有正負號"<<endl;  
  4.   cout<<"INT_MAX:"<<INT_MAX<<endl;  
  5.   cout<<"INT_MIN:"<<INT_MIN<<endl;  
  6.   cout<<"LONG_MAX:"<<LONG_MAX<<endl;  
  7.   cout<<"LONG_MIN:"<<LONG_MIN<<endl;  
  8.   cout<<"CHAR_MAX:"<<CHAR_MAX<<endl;  
  9.   cout<<"CHAR_MIN:"<<CHAR_MIN<<endl;  
  10.   cout<<"LONG_LONG_MAX:"<<LONG_LONG_MAX<<endl;  
  11.   cout<<"LONG_LONG_MIN:"<<LONG_LONG_MIN<<endl; 
  12.  
  13.   cout<<"無正負號:"<<endl;  
  14.   cout<<"UINT_MAX:"<<UINT_MAX<<endl;  
  15.   cout<<"ULONG_MAX:"<<ULONG_MAX<<endl;  
  16.   cout<<"UCHAR_MAX:"<<UCHAR_MAX<<endl;  
  17.   cout<<"ULLONG_MAX:"<<ULLONG_MAX<<endl;  
這章重點純粹要讓讀者記得他們的範圍,避免程式出現奇怪的答案,在加上比賽有時範圍比較大,想說明明答案對,但怎麼還是都紅的或是沒全對,問題可能在這裡。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 佑佑 的頭像
    佑佑

    佑佑的語言

    佑佑 發表在 痞客邦 留言(0) 人氣()