相关疑难解决方法(0)

左移位负移位计数

这到底发生了什么?

a << -5

显然它没有正确转变.但我正在阅读的这本书指出:

在一台机器上,这个表达式实际上是左移27位

我的问题是; 为什么?什么原因导致27位左移?在使用负移位计数换档时会发生什么?谢谢.

c

61
推荐指数
3
解决办法
5万
查看次数

为什么 C++ 中 `printf("%llu\n", 1ull &lt;&lt; n);` 和 `printf("%llu\n", 1ull &lt;&lt; 64);` 的输出不同?(n=64)

为什么C++中printf("%llu\n", 1ull << n);和的输出printf("%llu\n", 1ull << 64);不同?

代码:

#include <cstdio>

int main()
{
    int n = 64;
    printf("%llu\n", 1ull << n);
    printf("%llu\n", 1ull << 64);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
0
Run Code Online (Sandbox Code Playgroud)

c c++ bit-shift undefined-behavior

7
推荐指数
2
解决办法
227
查看次数

如果我们按位移动一个超过其大小的整数会发生什么

在Visual Studio编译以下C代码时,结果为4.

void main() { int c = 1; c = c<<34;}
Run Code Online (Sandbox Code Playgroud)

从Visual Studio反汇编窗口看到的汇编代码是

shl eax,22h
Run Code Online (Sandbox Code Playgroud)

从汇编开始,我们很容易看到我们正在转移34.由于这里的整数是4个字节,从结果来看很明显,模数运算是在机器级别上进行的,以使其工作为2.

我想知道这种行为是否跨平台标准化或跨平台不同?

c bit-shift

4
推荐指数
2
解决办法
3527
查看次数

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

这个问题的灵感来自 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
查看次数

标签 统计

c ×4

bit-shift ×3

undefined-behavior ×2

c++ ×1