比较无符号值时,如此测试:
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
必须是该类型可以代表的最大值.
该值为0
a int
,并且表示零~0
中的所有位都被int
翻转.该结果的值取决于int
您平台上的表示形式.然后将该值(可能是陷阱表示,感谢@Matt McNabb)转换为size_t
(遵循模运算的规则).
总之,结果值是否相等是实现定义的.(例如,如果int
是在二的补码表示,则值~0
是-1
,所以这两个是相同的.)
Mar*_* A. 19
if(pos == (size_t)~0)
Run Code Online (Sandbox Code Playgroud)
用于意图相当于:
if(pos == (size_t)-1)
Run Code Online (Sandbox Code Playgroud)
假设机器使用2的补码表示负整数.该标准没有强制执行,因此如果您希望您的代码100%可移植,则不应该假设它.