编译器在转换整数常量时有什么作用?

时间:2011-02-08 14:41:35

标签: c casting integer constants

使用以下宏:

#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未定义的吗?

1 个答案:

答案 0 :(得分:2)

如果您的平台上的int为16位,则0x8000的类型为unsigned int(请参阅标准的6.4.4第5页)。如果无法表示值,则转换为signed int是实现定义的(参见6.3.1.3第3页)。因此,代码的行为是实现定义的。

话虽如此,在实践中,我会假设这应该总是做你所期望的。这是什么编译器?

相关问题