在32位机器上进行左移操作,int型数a = 1左移32位的结果是什么?
在vs2010,以及gcc下编译运行结果均为1,有类似下面的警告。为什么左移32位其值不变?
警告:
1>------ 已启动生成: 项目: test_C++, 配置: Debug Win32 ------
1> test.cpp
1>test.cpp(10): warning C4293: “>>”: Shift 计数为负或过大,其行为未定义
1>test.cpp(11): warning C4293: “<<”: Shift 计数为负或过大,其行为未定义
1> test_C++.vcxproj -> E:\project_VS\test_C++\Debug\test_C++.exe
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
下面一段话给出解释:
在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。
那么,右移操作也有类似效果。
看下列代码:
int main() {
char a = 'a';
short s = 1;
int b = 5;
cout << typeid(a << 1).name() << endl; //char类型左移后类型自动转换为int
cout << typeid(s >> 3).name() << endl; //short类型右移后类型自动转换为int
printf("%d\n", b >> 32); //输出5,与右移0位效果一样
printf("%d\n", b << 33); //输出10,与左移1位效果一样
return 0;
}