【发布时间】:2011-10-05 09:51:32
【问题描述】:
我确实知道 ~0 将评估最大字长位 1(因此需要考虑可移植性),但我仍然不明白为什么 ((1 不鼓励?
如果您使用第二种形式并遇到任何麻烦,请分享。
【问题讨论】:
-
因为不是所有的 C 编译器/平台都对负数使用 2 补码。
-
@jv42 为什么适用?我在那里没有看到负数,除了 ~0 但它的负值不需要它的工作
-
您能否提供不鼓励使用
((1 << N) -1)的来源? -
@harold:问题是如果你在(例如)1s' 补码中使用
unsigned int x = ~0;。~0是所有位设置的,并且作为表示负零的有符号值(或者是陷阱表示)。所以当它转换为无符号时,结果是0,而不是UINT_MAX。unsigned int x = ~0;不关心可移植性,如果“可移植性”是指“包括非 2 的补码”。正确的做法是unsigned int x = -1;或unsigned int x = UINT_MAX;。 -
@harold:没错,但我不是在谈论 2 的补码。在不支持负零的 1 补码实现中,
~0是未定义的行为。所以严格符合代码不能写~0。不过,~0u还可以。同样的考虑适用于符号幅度表示中的(1 << N),适用于 1 的补码中的~0,因此就符号表示而言,它们同样糟糕。