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

Vil*_*ray 4 c casting c99

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

unsigned x = -1;
Run Code Online (Sandbox Code Playgroud)

要么

unsigned y = ~0;
Run Code Online (Sandbox Code Playgroud)

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

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

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

San*_*ker 6

#include <limits.h>

unsigned x = UINT_MAX;
Run Code Online (Sandbox Code Playgroud)


Eri*_*hil 6

unsigned x = UINT_MAX;<limits.h>根据定义,工作(包括之后)UINT_MAX.

unsigned x = -1;通过定义操作如何使用无符号整数(UINT_MAX+1添加或减去以使结果可表示,因此-1变为-1+UINT_MAX+1等于UINT_MAX).

unsigned x = ~0;不能保证工作,因为它~被定义为对整数位的操作,而不是对数值的操作,但C标准没有完全指定有符号整数的位.

unsigned x = ~0u;工作,因为0u是无符号整数,其值位由C标准完全指定.