使用以下宏:
#define MIN_SWORD (signed int) 0x8000
例如以下表达式:
signed long s32;
if (s32 < (signed long)MIN_SWORD)...
预计会进行以下检查:
if (s32 < -32768)
一些编译器似乎工作正常。但在其他一些编译器上,exprssion被评估为:
if (s32 < 32768)
我的问题:ANSI-C编译器如何评估以下表达式:
(signed long) (signed int) 0x8000
?
似乎在某些编译器中,转换为`(signed int)不会导致(预期)从正常数0x8000转换为signed int的最小负值,如果之后表达式转换为更宽的类型签名长。 换句话说,评估的常量不等于: -32768L(但32768L)
这种行为可能是ANSI-C未定义的吗?
答案 0 :(得分:2)
如果您的平台上的int
为16位,则0x8000
的类型为unsigned int
(请参阅标准的6.4.4第5页)。如果无法表示值,则转换为signed int
是实现定义的(参见6.3.1.3第3页)。因此,代码的行为是实现定义的。
话虽如此,在实践中,我会假设这应该总是做你所期望的。这是什么编译器?