为什么使用#define DEF((unsigned)-1)而不是#define 0xFFFFFFFF

时间:2013-04-19 02:20:38

标签: c c-preprocessor unsigned

C 语言中,为什么要使用以下行来定义一个所有位都设置为1的常量?:

#define EXTENDED_MEM_END    ((unsigned) -1)

而不是使用以下内容?:

#define EXTENDED_MEM_END    0xFFFFFFFF

或者只是这个?:

#define EXTENDED_MEM_END    -1

是否与可移植性(即避免警告),特定代码和/或其他内容有关?

我怀疑,由于 C 代码将 EXTENDED_MEM_END 标识符替换为((unsigned) -1),因此它实际上是一种使用正确的方法/期望值。

4 个答案:

答案 0 :(得分:3)

#define EXTENDED_MEM_END    0xFFFFFFFF
如果整数不是32位,

是不正确的;

#define EXTENDED_MEM_END    -1

不是未签名的。

答案 1 :(得分:1)

在32位机器上,尝试定义64个1位将溢出,并发出警告 - 但在64位机器上,仅定义32个1位将给出错误的值。

((unsigned)-1)会在所有情况下产生正确的结果(标准要求)。

答案 2 :(得分:1)

或者,使用UINT_MAX中的<limits.h>。 这将是便携式的。其他替代方案在不同的体系结构((unsigned)-1)上失败(在非二进制补充体系结构上失败(不是在实践中你会遇到很多问题))或0xffffffff(在64位体系结构上失败)或{ {1}}(在32位体系结构上失败)。

答案 3 :(得分:1)

对于32位操作系统,-1与0xFFFFFFFF相同,但对于64位操作系统,0xFFFFFFFF被视为0x00000000FFFFFFFF,因此它的值不是-1而是高正值。