对使用大小写operator ~
删除位时类型大小是否是一个因素感到好奇,我最终得到了这个奇怪的结果:
uint64_t x = 0xccccccccccccccccUL;
uint8_t y = 10;
auto z = ~y; // Debugger calls z an 'int' with value of 0xfffffff5
x &= z;
// x is now the correct value: 0xccccccccccccccc4
operator &
如何返回大于两个操作数之一的值?
以下示例进一步使我感到困惑,因为看起来逻辑相同,但产生的结果却不同:
uint64_t x = 0xccccccccccccccccUL;
x &= 0xfffffff5;
// Now x is 0x00000000ccccccc4
这解释了什么?不管类型大小/符号如何,实际上都可以使用x &= ~y
删除位吗?
答案 0 :(得分:3)
您要在此处进行两次扩展操作。第一个是您的 TypeError: undefined is not an object (evaluating 'item.receiver.first_name')
,它(像任何算术运算符一样)执行标准的“整数提升”。在这种情况下,由于源类型(~
)的所有值都可以放入uint8_t
中,因此执行了升级。因此,您已经注意到,int
被推导为类型z
。
第二个扩展操作是int
,在这种情况下,它等效于&=
。 x = x & z
不适合uint64_t
或int
,甚至不适合unsigned int
,但int64_t
和uint64_t
都适合int
中,因此就是所选类型。扩展(有符号的)uint64_t
涉及符号扩展,因此这就是多余位的来源。
要回答您的最后一个问题,否,如果int
具有符号类型或比{{1窄},使用x &= ~y
来清除一点是不安全的}}。有关更多信息,请参见this article,但最重要的是,如果可能会扩大促销范围,请确保将y
转换为预期的 unsigned 类型。如果您使用x
而不是~var
来使用uint8_t
,则不会遇到此问题。