-1和~0之间有区别吗?

yve*_*mes 18 c c++

比较无符号值时,如此测试:

if (pos == (size_t)-1)
Run Code Online (Sandbox Code Playgroud)

这种比较在技术上是否与以下类似:

if (pos == (size_t)~0)
Run Code Online (Sandbox Code Playgroud)

我不习惯第二种变体.这就是我问这个问题的原因.如果是的话,答案可能会相当直截了当.

Ker*_* SB 27

C++标准保证size_t是无符号类型,无符号类型遵循通常的模运算规则(其中模数是类型值表示中位数的2,参见3.9/4),因此-1转换为size_t必须是该类型可以代表的最大值.

该值为0a int,并且表示零~0中的所有位都被int翻转.该结果的值取决于int您平台上的表示形式.然后将该值(可能是陷阱表示,感谢@Matt McNabb)转换为size_t(遵循模运算的规则).

总之,结果值是否相等是实现定义的.(例如,如果int是在二的补码表示,则值~0-1,所以这两个是相同的.)

  • 注意,在一个补码中,"〜0"可能是一个陷阱表示(负零) (5认同)
  • @KerrekSB你说"取决于你平台上`int`的表示".出于兴趣,如果在演员之后发生倒置,即`〜((size_t)0)`,该怎么办?这会删除对`int`的实现的依赖吗?即,有更强的保证`(size_t)-1`和`〜((size_t)0)`是相同的?(Typo修复了我上次的评论) (3认同)

Mar*_* A. 19

假设(由标准保证)size_t指的是无符号整数值,这个:

if(pos == (size_t)~0)
Run Code Online (Sandbox Code Playgroud)

用于意图相当于:

if(pos == (size_t)-1)
Run Code Online (Sandbox Code Playgroud)

假设机器使用2的补码表示负整数.该标准没有强制执行,因此如果您希望您的代码100%可移植,则不应该假设它.

  • @ShafikYaghmour`~0`已签名.`~0 == 0`可能在一个补码系统上,然后转换为`size_t`仍然产生零.如果它是'~0ULL`,那可能是另一个故事. (4认同)
  • `size_t`总是无符号的. (2认同)