移位的位数是负数,结果会怎样?

本文探讨了在C++中,当移位位数为负数或超过类型最大位数时,正数和负数的左移和右移操作的特殊行为。负数左移可能变为正数,右移则始终补1。移位数超过类型最大位数时,实际移位数是对类型最大位数取模后的结果。当移位位数为负数时,会通过不断加类型最大位数直至结果为正来确定实际移位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有过编程经验的同学,对于移位操作应该很熟悉了,日常工作中或多或少都有用到,当 移位位数是负数 或者 移位位数超过了 类型的最大二进制位时,和正常移位处理是不一样的,下面将详细说明这两种情况,在此之前,先了解下正常的移位操作

正数的左移和右移

正数的左移是二进制位向左移动,右边留空的位置补 0,右移是二进制位向右移动,左边留空的位置补 0 ( 符号位为 0 )

  • 左移

左移操作,最高位的符号位会出现 0 或 1 , 因此结果会出现正数和负数的情况

新建测试文件 base.cpp,代码如下

#include <stdint.h>
#include <iostream>
using namespace std;
int32_t main(int32_t argc , char *argv[])
{
    int32_t a = 7;
    cout << "(a << 2) = " << (a << 2) << endl;
    cout << "(a << 30) = " << (a << 30) << endl;


    return 0;
}

执行 g++ -g -Wall -std=c++11 -o base base.cpp命令编译代码,再执行 ./base运行程序,结果如下

(a << 2) = 28
(a << 30) = -1073741824

上述代码中,变量 a的值为 7,对应的二进制是 0000 0000 0000 0000 0000 0000 0000 0111

左移 2 位:二进制向左移动 2 位,右边补充 2 位 0 ,左边丢弃超出的 2 位二进制, 结果是 0000 0000 0000 0000 0000 0000 0001 1100, 对应的十进制数是 28

左移 30 位 的流程如下图

由上图可知,二进制向左移动 30 位后, 左边 30 位二进制 0000 0000 0000 0000 0000 0000 0000 01 因超出被丢弃,同时最右边剩下的 2 位二进制 11 左移 30 位,右边空的位置补充 30 位 0,最终的结果是 1100 0000 0000 0000 0000 0000 0000 0000, 对应的十进制数是 -1073741824

可以看出,正数 7 左移 30 位后,二进制的符号位变成了 1 ,也即正数变成了负数了

  • 右移

正数右移,最小为 0 ÿ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值