相关疑难解决方法(0)

GCC左移溢出

在Mac上使用GCC版本4.2.1(Apple Inc. build 5664)时,以下小程序非常笨拙.

#include <stdio.h>

int main(){
        int x = 1 << 32;
        int y = 32;
        int z = 1 << y;
        printf("x:%d, z: %d\n", x, z);
}
Run Code Online (Sandbox Code Playgroud)

结果是x:0, z: 1.
知道为什么x和z的值不同吗?
非常感谢.

c macos gcc

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

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
查看次数

为什么没有留下位移<<在long int数据类型中移位超过31?

我想在我的程序中使用以下代码,但是gcc不允许我将我的1转移到31以上.

sizeof(long int) 显示8,所以这并不意味着我可以离开直到63?

#include <iostream>

using namespace std;

int main(){
    long int x;
    x=(~0 & ~(1<<63));
    cout<<x<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译输出以下警告:

left shift `count >= width` of type [enabled by default] `x=(~0 & ~(1<<63))`;
                                                                    ^
Run Code Online (Sandbox Code Playgroud)

输出为-1.如果我离开31位,我得到2147483647正如预期的那样.

我希望除了MSB之外的所有位都打开,从而显示数据类型可以容纳的最大值.

c++ bit-shift

8
推荐指数
1
解决办法
6599
查看次数

使用unsigned long类型进行位移会产生错误的结果

我有点困惑,因为我想unsigned long在我的系统上初始化一个大小为8字节的类型的变量(在我认为的每个现代系统上).当我想分配1 << 63给变量时,我得到一个编译器警告但是数字实际上是0.当我这样做时,1 << 30我得到了预期的结果2 ^ 30 = 1073741824.然而,当我这样做时1 << 31,我得到了2 ^ 64(我认为;实际上这不可能)打印的结果18446744071562067968.

任何人都可以向我解释这种行为吗?

c unsigned bit-shift

6
推荐指数
1
解决办法
5421
查看次数

如何在C中使用uint64_t

#include <stdio.h>
#include <stdint.h>

int main(){
    uint64_t a = 1 << 63;
    /* do some thing */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
$ gcc -Wall -Wextra -std=c99 test.c -o test  
warning: left shift count >= width of type [-Wshift-count-overflow]
Run Code Online (Sandbox Code Playgroud)

问:uint64_t应该有64位宽,为什么左移操作溢出?

c

4
推荐指数
1
解决办法
5952
查看次数

标签 统计

c ×4

bit-shift ×3

c++ ×1

gcc ×1

macos ×1

unsigned ×1