相关疑难解决方法(0)

当使用超过32次时,32位整数为什么不按预期工作,为什么不移位"<<"?

当我编写以下程序并使用GNU C++编译器时,1我认为输出是由编译器执行的旋转操作引起的.

#include <iostream>

int main()
{
    int a = 1;
    std::cout << (a << 32) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但从逻辑上讲,正如所说的那样,如果位溢出位宽就会丢失,输出应为0.发生了什么?

代码在ideone上,http: //ideone.com/VPTwj .

c++ bit-shift

59
推荐指数
7
解决办法
5万
查看次数

C标准对于比特类型宽度的位移更多的比特说了些什么?

请考虑以下代码:

int i = 3 << 65;
Run Code Online (Sandbox Code Playgroud)

我希望结果是i==0,但实际结果是i==6.通过一些测试,我发现使用以下代码:

int i, s;
int a = i << s;
int b = i << (s & 31);
Run Code Online (Sandbox Code Playgroud)

ab始终是相同的.

C标准是否说过关于移位超过32位(类型的宽度int)的任何内容,还是这种未指定的行为?

c bit-shift

10
推荐指数
1
解决办法
1651
查看次数

为什么将变量移位超过其位宽度会归零?

这个问题的灵感来自 StackOverflow 的其他问题。今天,在浏览 StackOverflow 时,我遇到了一个问题,即将变量按值 k 进行位移,该值 >= 该变量的位宽。这意味着将 32 位 int 移位 32 位或更多位。

将整数左移 32 位

意外的 C/C++ 按位移位运算符结果

从这些问题中可以明显看出,如果我们尝试将数字移位 >= 变量位宽的 k 位,则仅采用最低有效 log2k 位。对于 32 位 int,最低有效 5 位被屏蔽并作为移位量。

因此,一般来说,如果 w = 变量的位宽, x >> k则变为x >> (k % w) 对于 an int,则为x >> (k % 32)

计数被屏蔽为 5 位,这将计数范围限制为 0 到 31。

所以我编写了一个小程序来观察理论上应该产生的行为。我在评论中写下了最终的偏移量 % 32。

#include <stdio.h>
#include <stdlib.h>

#define PRINT_INT_HEX(x) printf("%s\t%#.8x\n", #x, x);

int main(void)
{
    printf("==============================\n");
    printf("Testing x …
Run Code Online (Sandbox Code Playgroud)

c bit-shift undefined-behavior

3
推荐指数
1
解决办法
4813
查看次数

标签 统计

bit-shift ×3

c ×2

c++ ×1

undefined-behavior ×1