编译器在转换整数常量时有什么作用?
使用以下宏:
#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转换为有符号整数的最小负值,如果之后表达式被转换为更宽泛的有符号长整型。 换句话说,评估的常量不等于:-32768L(但32768L)
这种行为可能是ANSI-C未定义的吗?
如果你的平台上的int
是16位,则0x8000
的类型是unsigned int
(参见标准的6.4.4 p.5)。 如果无法表示值,则转换为signed int
是实现定义的(参见6.3.1.3 p.3)。 因此,代码的行为是实现定义的。
话虽如此,在实践中,我会假设这应该总是做你所期望的。 这是什么编译器?