在 C 语言中,为什么要使用以下行来定义一个所有位都设置为1的常量?:
#define EXTENDED_MEM_END ((unsigned) -1)
而不是使用以下内容?:
#define EXTENDED_MEM_END 0xFFFFFFFF
或者只是这个?:
#define EXTENDED_MEM_END -1
是否与可移植性(即避免警告),特定代码和/或其他内容有关?
我怀疑,由于 C 代码将 EXTENDED_MEM_END 标识符替换为((unsigned) -1)
,因此它实际上是一种使用正确的方法/期望值。
答案 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而是高正值。