• 逻辑移位

逻辑移位是指逻辑左移和逻辑右移,移出的空位都用0来补。

  • 算术移位

算术移位 就需要分有符号型值和无符号型值
对于无符号型值,算术移位等同于逻辑移位。
而对于有符号型值 ,算术左移等同于逻辑左移,算术右移补的是符号位,正数补0,负数补1。

  • 那么C编译器中采用的是那种移位方式呢?

在汇编指令中,shl和shr表示逻辑左移和逻辑右移,sal和sar表示算术左移和算术右移。

首先让我们来看一段代码,

#include <stdio.h>int main()
{int a = 65;  //有符号整型 0100 0001unsigned int b = 65; //无符号整型 0100 0001a <<= 1; //1000 0010  130b >>= 1; //0010 0000  32char c = 127; //0111 1111c <<= 3; //1111 1000 -8char d = 127; //0111 1111d >>= 3; //0000 1111 15char e = -8; //内存以补码为1111 1000存储  源码为1000 1000 反码为1111 0111e >>= 3; //-1  补码1111 1111 源码 1000 0001 反码1111 1110printf("%d %d\n",a,b);//130 32printf("%d %d\n",c,d);//-8  15printf("%d\n",e);  //-1return 0;
}

让我们来看一看这一段代码的汇编代码

只看汇编代码进行分析:

汇编代码的第四行和第七行以及第十一行是对a,b,c三个变量进行的移位操作,即有符号型变量左移和无符号型右移C编译器都处理为逻辑移位,用的指令是shl和shr,移出的空位用0来补。

而对于汇编代码的第十五行和第十九行是对d,e两个变量进行的移位操作,即正数和负数的有符号型变量的右移,C编译器处理为算术移位,用的指令是sar,移出的空位,正数补0,负数补1。

  • 对于C编译器的逻辑移位和算术移位的总结

我所使用的C编译器是VS2008,基于该编译器采用对无符号型int,short,char进行移位时,编译器默认生成的汇编指令是逻辑左移和逻辑右移。
而对于有符号的int,short,char进行移位时,左移还是逻辑左移,但右移时生成的汇编指令是算术右移。

逻辑移位和算术移位的区别相关推荐

  1. 一劳永逸地理解逻辑移位和算术移位问题——与有无符号数_数据溢出_可移植性问题

     本文根据<C和指针>整理而得,并经过VS2013实验验证.如有错误或需要补充,欢迎与本人联系和探讨. 废话不多说,直接开门见山. 知识点: 什么是逻辑移位 无论是左移还是右移,空缺部 ...

  2. Verilog专题(十六)移位寄存器(逻辑移位、算术移位、循环移位)

    ​HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page 1.逻辑移位寄存器 题目 Build a 4-bit shift register (right ...

  3. java逻辑移位和算术移位,关于对移位运算的理解

    标签: 之前在<计算机组成原理>这门课中学习了很多,其中包括二进制数的移位运算.当时并不理解他们用来作甚,迷迷糊糊的状态,学了都不知道为什么要学.什么东西总是到了需要用到的时候,才明白,哦 ...

  4. C语言中的逻辑移位和算术移位

    1.逻辑移位 左边用0补充,右边丢弃: 2.算术移位 左边用原该值的符号位填充,右边丢弃. ---------------- c语言中的移位操作符,在左移时执行的是逻辑移位,即逻辑左移,在右移时执行的 ...

  5. 定点数的运算 —— 逻辑移位、算术移位、循环移位

    一.逻辑移位 逻辑移位的对象是无符号数,移位规则:逻辑左移时,高位移丢,低位添0:逻辑右移时,低位移丢,高位添0 二.算术移位 算术移位的对象是有符号数,在移位的过程中符号位保持不变. 对于正数 三种 ...

  6. HDLBits 系列(20)移位寄存器(逻辑移位、算术移位、循环移位)

    目录 4 bit的右移寄存器设计 100 bit循环移位寄存器 算术移位寄存器 4 bit的右移寄存器设计 先给出一个4位右移寄存器的设计题: Build a 4-bit shift register ...

  7. C语言之逻辑移位与算术移位

    C语言的移位操作符 >> << 可以将值按照二进制位左移或右移. 具体的实现方式如下: 左移 << 左移时值最左边的几位被丢弃, 右边多出来的空位用 0 补齐. 右 ...

  8. 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)

    移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...

  9. 【C语言】0x1F<<11等于0还是0xF800 ?

    1.左移运算符 格式:a<<b 将a这个数的各二进制位左移b位,要求b必须是非负整数,移动过程中,右边空出的位用0填补,高位左移溢出则舍弃该高位. 2.右移运算符 格式:a>> ...

最新文章

  1. 3D演示帮你一眼看懂线性规划问题,这篇可视化教程火了
  2. VS2010不能断点/下断的问题
  3. OVS ofproto(二十三)
  4. 图像分割之(六)交叉视觉皮质模型(ICM)
  5. QT的QHttpPart类的使用
  6. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】...
  7. 502 Bad Gateway - Registered endpoint failed to handle the request
  8. P3337-[ZJOI2013]防守战线【单纯形】
  9. matlab 中括号
  10. Anaconda创建虚拟环境报错—UnavailableInvalidChannel: The channel is not accessible or is invalid
  11. Unity3D基础18:物体查找与控制
  12. 牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。 但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。 牛牛希望你能帮他计算一共有,,,
  13. 易语言大漠插件模块制作后台找字FindStrExS和FindStrFastExS
  14. MySQL优化系列2-索引原理和优化
  15. 英语单词记忆原理及方法 - 超全思维导图梳理
  16. Android中的Drawable(一)
  17. u盘作为重要的计算机存储介质,U盘是采用FLASH MEMORY作为存储介质的移动存储设备...
  18. Linux基本知识总结、常用命令教程、shell脚本开发、编辑器及调试器的使用教程
  19. Spring 全家桶,永远滴神
  20. 计算机音乐设备简单配置,计算机音乐与作曲基础(高等学校艺术类专业计算机规划教材)...

热门文章

  1. 基于Python的经纬度与xy坐标系相互转换
  2. java归并排序详解
  3. 蓝懿ios网络请求bock
  4. Java研发岗面试复盘总结附答案+考点
  5. Cause: java.sql.SQLException: Field ‘id‘ doesn‘t have a default value
  6. CUBEMX配置STM32实现FTP文件传输以及使用SNTP获取网络时间并写入RTC
  7. java分词支持拼音_java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍...
  8. 无论LCD和OLED显示技术有多好,都无法替代这个古老的显示数码管
  9. 进阶 - Git的标签管理
  10. useImperativeHandle