4

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

unsigned x = -1;

或者

unsigned y = ~0;

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

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

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

4

3 回答 3

6
#include <limits.h>

unsigned x = UINT_MAX;
于 2013-04-08T14:03:03.147 回答
6

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

unsigned x = -1;根据操作如何与无符号整数一起工作的定义来工作(UINT_MAX+1添加或减去以使结果可表示,因此-1变为-1+UINT_MAX+1which equals UINT_MAX)。

unsigned x = ~0;不保证有效,因为~被定义为对整数位的操作,而不是对数值的操作,但 C 标准并未完全指定有符号整数的位。

unsigned x = ~0u;有效,因为0u它是一个无符号整数,并且它的值位完全由 C 标准指定。

于 2013-04-08T14:08:01.960 回答
3

首先,

unsigned x = -1;

更便携。保证在每个符合要求的实现上设置xto的值。UINT_MAX

第二,

unsigned x = ~0;

在 a 上进行按位补码int,因此不能保证 is 的值~0--1它不在一个的补码或符号和大小机器上,它甚至可能是一个陷阱表示。

替代方案

unsigned x = ~0u;

它采用unsigned零的补码,也是完全可移植的。

于 2013-04-08T14:07:50.783 回答