Advertisement

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)

还没有任何评论哟~