2011-02-08 32 views
3

使用下面的宏:編譯器在轉換整數常量時有什麼作用?

#define MIN_SWORD (signed int) 0x8000 

在例如下面的表達式:

signed long s32; 
if (s32 < (signed long)MIN_SWORD)... 

有望做以下檢查:

if (s32 < -32768) 

其中一些編譯器似乎很好地工作。但在其他一些編譯器的p21蛋白表達被評價爲:

if (s32 < 32768) 

我的問題:一個ANSI-C編譯器應該如何評估以下表達式: (signed long) (signed int) 0x8000

似乎在某些編譯器上轉換爲`(signed int)不會導致從正常數0x8000到有符號整數的最小負值的(預期)轉換,如果之後表達式被轉換爲更寬類型的簽名長。 換句話說,評估常數不等於: -32768L(但32768L)

此行爲可能未定義ANSI-C?

+0

我忘了提到probelm與16位int的嵌入式目標相關。 – Oliver 2011-02-08 14:42:58

+0

切線評論:您不應該需要爲限制生成自己的宏,因爲它們都應該已經在`limits.h`中。 – 2011-02-08 15:01:30

回答

2

如果您的平臺上的某個int是16位,那麼0x8000的類型爲unsigned int(請參閱該標準的6.4.4第5頁)。如果值不能表示,轉換爲signed int是實現定義的(見6.3.1.3 p.3)。所以你的代碼的行爲是實現定義的。

話雖如此,在實踐中,我會假設這應該總是做你所期望的。這是什麼編譯器?

相關問題