我有个问题。
uint64_t var = 1; // this is 000000...00001 right?
在我的代码中,这可行:
var ^ (1 << 43)
但是如何知道1应该是64位呢?我不应该写这个吗?
var ^ ( (uint64_t) 1 << 43 )
如您所料,1是一个普通符号int
(在您的平台上,2的补码算术可能是32位宽),而43也是如此,因此,任何机会都可能1<<43
导致溢出:实际上,如果两个参数都属于int
运算符规则类型决定结果int
也是。
不过,在C中,有符号整数溢出是未定义的行为,因此原则上任何事情都可能发生。在您的情况下,编译器可能发出了在64位寄存器中执行该移位的代码,因此幸运的是,它似乎可以工作。要获得保证正确的结果,您应该使用编写的第二种形式,或者使用后缀(保证至少为64位)指定1
为unsigned long long
文字。ull
unsigned long long
var ^ ( 1ULL << 43 )
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句