C语言有符号数和无符号数的左移和右移
发布时间
阅读量:
阅读量
#include <vector>
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
// 左移
unsigned int un_stringify = 0xa0000000;
int stringify = 0xa0000000;
cout << "无符号左移:" << endl;
// 1010 0000 0000 0000 0000 0000 0000 0000 = 2^31 + 2^29 = 2684354560
cout << un_stringify << endl;
// 0100 0000 0000 0000 0000 0000 0000 0000 = 2^30 = 1073741824
cout << (un_stringify << 1) << endl;
// 等价于左移1位
cout << (un_stringify << 33) << endl;
//1000 0000 0000 0000 0000 0000 0000 0000 = 2^31 = 2147483648
cout << (un_stringify << 2) << endl;
// 等价于左移2位
cout << (un_stringify << 34) << endl;
cout << "有符号左移:" << endl;
// 1010 0000 0000 0000 0000 0000 0000 0000 这是原码 转换成补码是:1110 0000 0000 0000 0000 0000 0000 0000=-(2^30+2^29)=1610612736
cout << (stringify) << endl;
// 0100 0000 0000 0000 0000 0000 0000 0000 = 2^30 = 1073741824
cout << (stringify << 1) << endl;
// 等价于左移1位
cout << (stringify << 33) << endl;
// 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648,最小的负数
cout << (stringify << 2) << endl;
// 等价于左移2位
cout << (stringify << 34) << endl;
cout << "无符号右移:" << endl;
// 1010 0000 0000 0000 0000 0000 0000 0000 = 2^31 + 2^29 = 2684354560
cout << un_stringify << endl;
// 0101 0000 0000 0000 0000 0000 0000 0000 = 2^30 + 2^28 = 1342177280
cout << (un_stringify >> 1) << endl;
// 等价于右移1位
cout << (un_stringify >> 33) << endl;
// 0010 1000 0000 0000 0000 0000 0000 0000 = 2^29 + 2^27 = 671088640
cout << (un_stringify >> 2) << endl;
// 等价于右移2位
cout << (un_stringify >> 34) << endl;
cout << "有符号右移:" << endl;
// 1010 0000 0000 0000 0000 0000 0000 0000
cout << stringify << endl;
// 1101 0000 0000 0000 0000 0000 0000 0000 ,这是原码,转换成补码是-(2^29+2^28) = -805306368
cout << (stringify >> 1) << endl;
cout << (stringify >> 33) << endl;
// 1110 1000 0000 0000 0000 0000 0000 0000 = ,这是原码,转换成补码是-(2^28+2^27) = -402653184
cout << (stringify >> 2) << endl;
cout << (stringify >> 34) << endl;
return 0;
}
输出结果如下:
无符号左移:
2684354560
1073741824
1073741824
2147483648
2147483648
有符号左移:
-1610612736
1073741824
1073741824
-2147483648
-2147483648
无符号右移:
2684354560
1342177280
1342177280
671088640
671088640
有符号右移:
-1610612736
-805306368
-805306368
-402653184
-402653184
总结:左移操作无论针对带有符号的数字还是不带符号的数字,在最低有效位后添加零;右移操作中,则分两种情况处理:无符号数时高位填零;而带符号的数字右移时,在高位补充其对应的符号位;值得注意的是,在处理负数值时,则需要将其转换为二进制补码形式进行运算。
全部评论 (0)
还没有任何评论哟~
