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?
我忘了提到probelm與16位int的嵌入式目標相關。 – Oliver 2011-02-08 14:42:58
切線評論:您不應該需要爲限制生成自己的宏,因爲它們都應該已經在`limits.h`中。 – 2011-02-08 15:01:30