C 语言左移运算符是<<,右移运算符是>>,属于位运算符,直接对整数的二进制补码进行移位操作,作用对象只能是整型、字符型这类整数类型,不能用于 float、double 浮点数。左移就是二进制位全部向左移动,高位丢弃,低位补 0,数学效果等价于乘以 2 的 n 次方;右移要区分无符号数和有符号数,无符号数右移高位补 0,有符号数主流编译器是算术右移,高位补符号位,数学效果近似除以 2 的 n 次方。移位运算执行速度比乘除法更快,在单片机、嵌入式、寄存器操作、位标志位处理场景使用非常广泛,但是有符号负数移位、移位位数过大属于重点易错考点。
一 基础语法格式
左移:a << n 将 a 的二进制位向左移动 n 位
右移:a >> n 将 a 的二进制位向右移动 n 位
规则:参与运算的 char、short 会自动整型提升为 int 再执行移位
二 左移 << 详细规则
二进制所有位向左平移 n 位,左边超出的高位直接舍弃,右边空出来的低位补 0
等价运算:a << n ≈ a (2^n)
举例:5 << 2,5 二进制是 0101,左移 2 位变成 010100,也就是十进制 20,等于 5×4
⚠️ 重要风险:左移之后如果数值溢出,超出该类型存储位宽,高位被丢弃,结果不再等于乘法,会发生溢出错误
三 右移 >> 详细规则
无符号整数右移
逻辑右移:高位全部补 0,结果一定是非负数,等价整除 2^n
有符号 int 负数右移
算术右移:高位补原来的符号位(负数符号位是 1,高位补 1),保持负数属性
举例:-8 >> 1 结果是 - 4
注意:C 标准只规定有符号数右移是实现定义行为,部分平台可能是逻辑右移,跨平台代码不要依赖这个特性
四 核心对照表
| 运算符 | 名称 | 补位规则 | 数学近似效果 |
|---|---|---|---|
| << | 左移 | 低位补 0,高位丢弃 | 乘以 2 的 n 次方 |
| >> | 无符号右移 | 高位补 0 | 整除 2 的 n 次方 |
| >> | 有符号右移 | 高位补符号位 | 近似整除 2 的 n 次方 |
五 常用应用场景
- 寄存器位操作,设置标志位:1 << bit 生成指定位掩码
- 快速乘除 2、4、8 等 2 的幂,嵌入式高频使用
- 提取位域,配合 & 按位与,读取某几位数据
- 位掩码、开关控制,比如reg |= (1<<3)开启第 3 位
六 深度要点与坑点
第一 移位位数 n 不能小于 0,如果 n 大于等于该类型总位数,属于未定义行为,比如 int 是 32 位,写a << 32是错误写法。
第二 左移虽然等价乘 2 的幂,但是溢出之后结果错误,不能无脑把所有乘法替换成左移。
第三 不要混淆移位运算符和流运算符,C++ 里面<< >>是输入输出流,C 语言没有流对象,只做位运算。
第四 char、short 移位之前会自动提升成 int,运算结果类型是 int。
七 常见误区
误区一 右移永远等于整除,错误,负数算术右移是向负无穷取整,和普通整数除法向零取整结果有差别
误区二 移位可以用于 double,错误,只能整型
误区三 移位位数随便写,错误,移位位数不能超过类型位宽
常见问题 FAQ
问题 1 C 语言左移右移运算符 左移为什么相当于乘以 2
回答 1 C 语言左移右移运算符,二进制每向左移动一位,每一位权值翻倍,整体数值扩大 2 倍,所以左移 n 位等价乘以 2 的 n 次方,溢出之后该等式失效。
问题 2 C 语言左移右移运算符 有符号负数右移高位补什么
回答 2 C 语言左移右移运算符,主流编译器有符号负数执行算术右移,高位补符号位也就是 1,保持负数性质,该行为属于实现定义,跨平台需要谨慎。
问题 3 C 语言左移右移运算符 移位位数超过类型总位数会怎么样
回答 3 C 语言左移右移运算符,如果移位位数大于等于该类型总位数,属于未定义行为,程序结果不确定,开发需要增加判断限制移位位数。
问题 4 C 语言左移右移运算符 左移溢出是什么意思
回答 4 C 语言左移右移运算符,左移之后高位超出变量存储位宽被丢弃,数值不再等于原来数值乘以 2 的 n 次方,就是移位溢出,int 类型要特别注意这个问题。
免责声明
本文是 C 语言左移右移运算符相关基础知识讲解,有符号整数右移属于实现定义行为,不同编译器、CPU 平台可能存在差异,移位溢出、移位位数非法属于未定义行为,示例仅用于学习参考,嵌入式工程代码请结合芯片手册规范实现,程序异常由开发者自行排查处理。
本文来自作者[静家叙识]投稿,不代表新极网立场,如若转载,请注明出处:https://www.xjqnpx.com.cn/zsbk/202611/162671.html
评论列表(4条)
我是新极网的签约作者“静家叙识”!
希望本篇文章《C 语言左移右移运算符 位运算深度讲解》能对你有所帮助!
本站[新极网]内容主要涵盖:生活百科,小常识,生活小窍门,百科大全
本文概览:C 语言左移运算符是,属于位运算符,直接对整数的二进制补码进行移位操作,作用对象只能是整型、字符型这类整数类型,不能用于 float、double 浮点数。左移就是二进制位全部向左移动,高位丢弃,低位补 0,数学效果等价于乘以 2 的 n 次方;右移要区分无符号数和有符号数,无符号数右移高位补 0,有符号数主流编译器是算术右移,高位补符号位,数学效果近似除以 2 的 n 次方。移位运算执行速度比乘除法更快,在单片机、嵌入式、寄存器操作、位标志位处理场景使用非常广泛,但是有符号负数移位、移位位数过大属于重点易错考点。