uint64_t变量中C的按位移位运算

aln*_*net 3 c 64-bit bit-manipulation

我有以下示例代码:

uint64_t x, y;
x = ~(0xF<<24);
y = ~(0xFF<<24);
Run Code Online (Sandbox Code Playgroud)

结果将是:

x=0xfffffffff0ffffff
y=0xfffff
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个区别吗?为什么x计算超过64位而y只计算在32位?

cip*_*hor 6

默认操作是32位.

x=~(0xf<<24);
Run Code Online (Sandbox Code Playgroud)

此代码可以反汇编为以下步骤:

int32_t a;
a=0x0000000f;
a<<=24;   // a=0x0f000000;
a=~a;     // a=0xf0ffffff;
x=(uint64_t)a;  // x = 0xfffffffff0ffffff;
Run Code Online (Sandbox Code Playgroud)

和,

y = ~(0xFF<<24);

int32_t a;
a=0x000000ff;
a<<=24;   // a=0xff000000;
a=~a;     // a=0x00ffffff;
x=(uint64_t)a;  // x = 0x000000000ffffff;
Run Code Online (Sandbox Code Playgroud)