以下哪一项是设置无符号整数最大值的可移植方式?

时间:2013-04-08 14:00:02

标签: c casting c99

在符合C99的C中,假设没有预处理器宏定义,这是设置无符号整数最大值的更便携方式:

unsigned x = -1;

unsigned y = ~0;

我记得几年前我遇到过一个帖子,声称将 unsigned int 设置为-1更加便携,因为~0有某种隐藏系统上的陷阱表示;我不再觉得这是真的。

我知道在C99标准(即模数值等)中很好地定义了将无效值设置为无符号变量的行为,但是0的倒置怎么样?

此外,如果两个操作都是同等可移植的,并且假设没有编译器优化,哪个操作在时钟周期方面会更有效?

3 个答案:

答案 0 :(得分:6)

#include <limits.h>

unsigned x = UINT_MAX;

答案 1 :(得分:5)

根据{{​​1}}的定义,

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零的补码,也是完全可移植的。