对于大的多头,右移无法正常工作

问题描述 投票:0回答:1

在移动字节时,有一些场景看起来没有意义,例如

printf("shifted bytes %llx\n",(((long long)1 << 63 ))>>1);

输出 c000000000000000,对于 unsigned long long 或如果初始向左移位小于 63,则不会发生这种情况。但是,由于 1 在有符号 long long 和无符号 long long 中都存储为 0000000000000001 并且仅执行按位运算,因此似乎不存在就像有任何原因造成的差异一样,怎么会发生这样的事情?

c bit-manipulation bitwise-operators bit-shift
1个回答
0
投票

您正在将一个有符号值移入符号位。 更正式地说,移位的结果超出了

long long
可以存储的值范围。 这会在您的代码中触发未定义的行为

关于左移运算符,C 标准的第 6.5.8p2 节对此进行了描述:

E1

<<
E2 的结果是 E1 左移 E2 位位置;腾出 位用零填充。如果 E1 具有无符号类型,则值 结果是 E1 × 2E2,比最大值减少模一 可在结果类型中表示。 如果 E1 有符号类型并且 非负值,并且 E1 × 2E2 可以用结果类型表示, 那么这就是结果值;否则,行为是 未定义。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.