0

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

4 回答 4

3
#define EXTENDED_MEM_END    0xFFFFFFFF

如果整数不是 32 位,则不正确;

#define EXTENDED_MEM_END    -1

不是未签名的。

于 2013-04-19T02:29:48.533 回答
1

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

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

于 2013-04-19T02:28:23.123 回答
1

或者,使用UINT_MAXfrom <limits.h>。这将是便携式的。其他替代方案在不同的架构((unsigned)-1)上失败(在非二进制补码架构上失败(并不是说你在实践中会遇到这个问题))或0xffffffff(在 64 位架构0xffffffffffffffff上失败)或(在 32 位架构上失败)。

于 2013-04-19T03:00:50.323 回答
1

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

于 2013-04-19T04:12:59.963 回答