2013-06-18 43 views
2

我對INT_MIN/-1有以下代碼。我期望這已經出來是INT_MAX + 1(或翻轉0)。但是,我得到的實際結果是INT_MIN。這是我的測試代碼:INT_MIN/-1是否在C++中定義了行爲?

#define __STDC_LIMIT_MACROS 
#include <stdint.h> 
#include <stdio.h> 
#include <limits.h> 
using namespace std; 
int main() 
{ 
    int min=INT_MIN; 
    int res=min/-1; 
    printf("result: %i\n", res); 
    printf("max: %i min: %i\n", INT_MAX, INT_MIN); 
    return 0; 
} 

此實現是否特定和/或未定義的行爲?

+0

簽名溢出是不確定的,只有無符號的溢出定義爲「模數'1個<< width'」。 – 2013-06-18 18:30:08

+0

「INT_MAX + 1」在滾動時不爲0,它是「INT_MIN」。 – chris

+0

如果有符號整數的表示是「補碼」或「有符號」的數量級,則會定義它的行爲,因爲不會發生溢出。 –

回答

5

此實現是否特定和/或未定義行爲?

是的,有符號的整數溢出是未定義的行爲。每C++ 11標準第5/4:

如果表達式的評估過程中,其結果是不數學上或不在其類型 表示的值的範圍限定,該行爲是未定義。 [...]

請注意,這同樣不適用於無符號的算術。段規定3.9.1/4和腳註46:

無符號整數,聲明無符號,應當服從算術模2^n其中n是位在該特定大小的值表示的數目 的法律整數。 [012]

這意味着無符號算術不會溢出,因爲不能由結果 無符號整數類型表示的結果以模數減少爲大於可以由 生成無符號整數類型。

2

這是 Ensure that operations on signed integers do not result in overflow如何是偉大的符號整數溢出,因此不確定的行爲,這Cert文件,據我可以告訴涵蓋了所有的實例。這是從Division部分覆蓋你的問題if聲明:

if ((sl2 == 0) || ((sl1 == LONG_MIN) && (sl2 == -1))) { 
    /* Handle error condition */ 
} 
else { 
    result = sl1/sl2; 
} 
相關問題