比较无符号值时,如此测试中所示:
if (pos == (size_t)-1)
这种比较在技术上是否与以下不同:
if (pos == (size_t)~0)
我不习惯第二种变体。 这就是我问这个问题的原因。 如果是的话,答案可能会相当直接。
C ++标准保证size_t
是无符号类型,无符号类型遵循通常的模运算规则(其中模数是类型值表示中位数的2,参见3.9 / 4),因此-1
转换为size_t
必须是该类型可以表示的最大值。
值0
是int
,并且~0
表示int
表示中的所有位都为零翻转。 该结果的值取决于平台上int
的表示forms。 然后将该值(可能是陷阱表示,感谢@Matt McNabb)转换为size_t
(这是按照模运算的规则完成的)。
总之,结果值是否相等是实现定义的。 (例如,如果int
以二进制补码表示,则int
的值为-1
,因此两者相同。)
假设(由标准保证)size_t指的是无符号整数值 ,这个:
if(pos == (size_t)~0)
用于意图相当于:
if(pos == (size_t)-1)
假设机器使用2的补码表示负整数。 该标准没有强制执行,因此如果您希望您的代码100%可移植,则不应该假设它。
因此,在您的示例中, 技术上没有任何区别。 因为很难找到一个不会优化文字操作的编译器,如-1
和~0
。 以你的例子我完全得到:
; ... movq $-1, -16(%rbp) movq $-1, -8(%rbp) ; ...
不要害怕那些
-1
,所谓无类型;)
更有趣的问题是,如果你的例子是:
#include int main() { int var0 = 0; int var1 = 1; size_t a = (size_t) -var1; size_t b = (size_t) ~var0; return a ^ b; }
在我的情况下(Kubuntu,gcc 4.8.2,x86_64, -O0
选项),感兴趣的部分是:
movl $0, -24(%rbp) ; var0 = 0 movl $1, -20(%rbp) ; var1 = 1 movl -20(%rbp), %eax negl %eax ; 2's complement negation ; ... movl -24(%rbp), %eax notl %eax ; 1's complement negation ; ...
查看英特尔手册:
NEG
– 两个补充否定用其二进制补码替换操作数(目标操作数)的值。 (此操作相当于从0减去操作数。)
NOT
– 一个补语否定在目标操作数上执行按位NOT运算(每个1设置为0,每个0设置为1),并将结果存储在目标操作数位置。
从理论上讲,我的结论是,在一些奇特的平台和编译器上,代码可能会有所不同,但是否则 – 否则。 如果不确定,请检查平台上的assembly清单。
以上就是c/c++开发分享-1和~0之间有区别吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560695.html