在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的值不同吗?
非常感谢.
请考虑以下代码:
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)
值a和b始终是相同的.
C标准是否说过关于移位超过32位(类型的宽度int)的任何内容,还是这种未指定的行为?
我想在我的程序中使用以下代码,但是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之外的所有位都打开,从而显示数据类型可以容纳的最大值.
我有点困惑,因为我想unsigned long在我的系统上初始化一个大小为8字节的类型的变量(在我认为的每个现代系统上).当我想分配1 << 63给变量时,我得到一个编译器警告但是数字实际上是0.当我这样做时,1 << 30我得到了预期的结果2 ^ 30 = 1073741824.然而,当我这样做时1 << 31,我得到了2 ^ 64(我认为;实际上这不可能)打印的结果18446744071562067968.
任何人都可以向我解释这种行为吗?
#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位宽,为什么左移操作溢出?