分配时的Bitshift对变量没有影响

mic*_*doo 1 c bit-manipulation bit-shift

我以为我在这个答案中找到了类似的东西但是在那种情况下他们没有将表达式的结果赋给变量.在我的情况下,我正在分配它,但表达式的bitshift部分没有任何效果.

unsigned leftmost1 = ((~0)>>20);
printf("leftmost1 %u\n", leftmost1);
Run Code Online (Sandbox Code Playgroud)

返回

leftmost1 4294967295
Run Code Online (Sandbox Code Playgroud)

unsigned leftmost1 = ~0;
leftmost1 = leftmost1 >> 20;
printf("leftmost1 %u\n", leftmost1);
Run Code Online (Sandbox Code Playgroud)

给我

leftmost1 4095
Run Code Online (Sandbox Code Playgroud)

我希望将逻辑分成两行没有影响,为什么结果不同?

Bee*_*ope 6

在第一种情况下,您正在进行签名的右移,因为~0结果是有符号的值.签名右移的确切行为是实现定义的,但是大多数平台(包括你的平台)都会扩展符号位,因此对于"全部"的输入,移位是无操作的.

在第二种情况下,您正在进行无符号右移,因为它leftmost1是一个unsigned值.所以你从左边移动零.

如果你想在没有中间assignmetn的情况下进行无符号移位,你可以这样做:

(~0u) >> 20
Run Code Online (Sandbox Code Playgroud)

u后缀表示一个无符号的文字.

  • 标准确实指定,并指定实现必须记录其选择.这与说这种行为可能是有效的随机性有很大的不同. (3认同)