2016-11-22 170 views
0

我遇到了一個問題,我的小c程序。溢出不被承認,p不是打印警告

我想打印出一個警告,如果發生溢出,我正在使用limits.h庫來識別溢出與INT_MAX。 我想這個問題是我是否循環,但我真的不能找到問題...

#include<stdio.h> 
#include<limits.h> 

int main() 
{ 
    int x = 1627964; 
    int y = 9; 

    for(int i=1; i<y; ++i){ 
     x*= i; // x= x * i 
     printf("%d * %d \n",x , i+1); 
     if(x >= INT_MAX){ 
      printf("An Overflow has occured!\n"); 
      return 0; 
      break; 
     } 
    } 
} 

我認爲發生溢出7相乘後:

1627964 * 2 
3255928 * 3 
9767784 * 4 
39071136 * 5 
195355680 * 6 
1172134080 * 7 
-384996032 * 8 
1214999040 * 9 

我可以」噸真的知道爲什麼警告沒有打印出來......

有些幫助將是非常感激,謝謝:)

+2

因爲x不等於INT_MAX。這就像你寫'if(x == 5)'而x不是5你在期待什麼? – immibis

+0

編輯我的帖子... – werther

+0

也注意,根據定義,x不能> INT_MAX。那就是爲什麼叫INT_MAX – pm100

回答

-3

x == INT_MAX只有測試,如果x正好等於INT_MAX。不少於,不多,完全等於

你應該測試的是有符號整數溢出,當你乘以1627964時出現8:if (x==INT_MAX || x < 0) - 符號位得到遞增,這會使得你的值爲負數。

+0

鑑於'x'是一個'int',它怎麼會*大於'INT_MAX'? –

+0

你不能測試> INT_MAX根據定義 – pm100

+0

對不起,我的答案更新了 –

0

只有unsigned int定義了溢出行爲,signed int不行,所以編譯器如果檢測到它可能會丟掉一半的代碼。無論如何,在你的代碼中int永遠不會比INT_MAX大,因爲溢出時它應該是負值。

0

如果你嘗試int max/i < x的溢出?