在符合C99的C中,假设没有预处理器宏定义,这是设置无符号整数最大值的更便携方式:
unsigned x = -1;
或
unsigned y = ~0;
我记得几年前我遇到过一个帖子,声称将 unsigned int 设置为-1
更加便携,因为~0
有某种隐藏系统上的陷阱表示;我不再觉得这是真的。
我知道在C99标准(即模数值等)中很好地定义了将无效值设置为无符号变量的行为,但是0
的倒置怎么样?
此外,如果两个操作都是同等可移植的,并且假设没有编译器优化,哪个操作在时钟周期方面会更有效?
答案 0 :(得分:6)
#include <limits.h>
unsigned x = UINT_MAX;
答案 1 :(得分:5)
unsigned x = UINT_MAX;
有效(在包括<limits.h>
之后)。
UINT_MAX
定义了操作如何使用无符号整数(unsigned x = -1;
被添加或减去以使结果可表示,因此UINT_MAX+1
变为-1
等于{{ 1}})。
-1+UINT_MAX+1
不能保证工作,因为UINT_MAX
被定义为对整数位的操作,而不是对数值的操作,但有符号整数的位不完整由C标准规定。
unsigned x = ~0;
有效,因为~
是无符号整数,其值位由C标准完全指定。
答案 2 :(得分:3)
第一个,
unsigned x = -1;
更便携。保证在每个符合要求的实现上将x
的值设置为UINT_MAX
。
第二,
unsigned x = ~0;
对int
进行按位补码,因此无法保证~0
的值为-1
- 它不在'补码或符号和幅度上机器,它甚至可能是陷阱表示。
替代
unsigned x = ~0u;
采用unsigned
零的补码,也是完全可移植的。