首页 > 编程知识 正文

C语言有符号数和无符号数的左移和右移

时间:2023-05-04 21:04:03 阅读:190673 作者:419

#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;}

输出结果如下:

无符号左移:26843545601073741824107374182421474836482147483648有符号左移:-161061273610737418241073741824-2147483648-2147483648无符号右移:268435456013421772801342177280671088640671088640有符号右移:-1610612736-805306368-805306368-402653184-402653184

总结:左移,不管对于有符号数还是无符号数,都是最低位补0,右移时,对于无符号,高位补0,对于有符号,高位都补符号位,并且,当数是负数时,对于有符号数,要转换成补码的形式

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。