深入理解C语言中的移位运算

说明:本文主要摘录自《深入理解计算机系统》第二章信息的表示与处理。

移位运算:

C语言还提供了一组移位运算,以便向左或者向右移动位模式。对于一个位表示为[xn-1,xn-2,…,x0]的操作数x,C表达式x<

有一个相应的右移运算x>>k,但是它的行为有点微妙。一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是[0,…,0,xn-1,xn-2,…,xk]。算术右移是在左端补k个最高有效位的值,得到的结果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]。这种做法看上去可能有点奇特,但是我们会发现它对有符号整数数据的运算非常有用。

让我们来看一个例子,下面的表给出了对某些实例8位数据做不同的移位操作得到的结果。

操作

参数X

[0110 0011]    [1001 0101]

X<<4

[0011 0000]    [0101 0000]

X>>4(逻辑右移)

[0000 0110]    [0000 1001]

X>>4(算术右移)

[0000 0110]    [1111 1001]

斜体的数字表示的是最右端(左移)或最左端(右移)填充的值。可以看到除了一个条目之外,其他的都涉及填充0。唯一的例外是算术右移[10010101]的情况。因为操作数的最高位是1,填充的值就是1。

C语言标准并没有明确定义应该使用哪种类型的右移。对于无符号数据(也就是以限定词unsigned声明的整型对象),右移必须是逻辑的。而对于有符号数据(默认的声明的整型对象),算术的或者逻辑的右移都可以。不幸的是,这就意味着任何假设一种或者另一种右移形式的代码都潜在着可移植性问题。然而,实际上,几乎所有的编译器/机器组合都对有符号数据使用算术右移,且许多程序员也都假设机器会使用这种右移。

另一方面,Java对于如何进行右移有明确的定义。表达式x>>k会将x算术右移k个位置,而x>>>k会对x做逻辑右移。

当移动k位,这里k很大时

对于一个由w位组成的数据类型,如果要移动k≥w位会得到什么结果呢?例如,在一个32位机器上计算下面的表达式会得到什么结果:

Int       lval = 0xFEDCBA98  << 32;

int       lval = 0xFEDCBA98  >> 36

unsigned  lval = 0xFEDCBA98u  >> 40;

C语言标准很小心地规避了说明在这种情况下该如何做。在许多机器上,当移动一个w位的值时,移位指令只考虑位移量的低log2w位,因此实际上位移量就是通过计算k mod w得到的。例如,在一台采用这个规则的32位机器上,上面三个移位运算分别是移动0、4和8位,得到结果:

Lval    0xFEDCBA98

Aval    0xFEDCBA9

Uval    0x00FEDCBA

不过这种行为对于C程序来说是没有保证的,所以移位数量应该保持小于字长。另一方面,Java特别要求位移数量应该按照我们前面所讲的求模的方法来计算。

与移位运算有关的操作符优先级问题

常常有人会写这样的表达式1<<2+3<<4,其本意是(1<<2)+(3<<4)。但是在C语言中,前面的表达式等价于1<

c语言4字节移位运算,深入懂得C语言中的移位运算相关推荐

  1. c语言取字节高四位低四位,C语言取一个数的最高位

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:C语言取一个数的最高位回答:#include void main(){int n,m;scanf("%d",n);m=n;while ...

  2. c 语言测量字节数,用C/C++测试编译器中关键字占多少个字节?以及16/32/64位平台下的字节数...

    转自这位大佬:https://blog.csdn.net/cherrydreamsover/article/details/81410364 https://blog.csdn.net/cherryd ...

  3. python中字符移位加密_Python加密器(字母表中的移位)

    我正在积极学习Python(3.5)并非常喜欢它.在 我想熟悉字符串操作,因此决定制作一个基本的加密/解密器,它将字符串在字母表中向前移动一个.在 代码如下:def encrypt(string): ...

  4. c语言 二进制输出_推荐收藏!C语言入门基础知识大全

    01C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,使小伙伴对c语言有个初步认识. 例1:计算两个整数之和的c程序: #include main() {i ...

  5. C 语言中负数移位运算讲解

    C 语言中负数移位运算讲解 "<<".">>"为移位运算符. "<<"为左移位运算符,即数据字节中的每个 ...

  6. c语言 高字节和高字节运算 低字节和低字节运算,C语言关系运算符和位运算符.ppt...

    <C语言关系运算符和位运算符.ppt>由会员分享,可在线阅读,更多相关<C语言关系运算符和位运算符.ppt(42页珍藏版)>请在装配图网上搜索. 1.第3章 关系运算符和位运算 ...

  7. c语言中加减和移位,c中的移位运算

    C++位运算,看高手都是运用的灵活自如,打算从今天开始学习他!收藏 每次看到位运算的地方,都比较迷糊.以前学习C的时候也不求甚解,到现在看来,觉得位运算和指针在C++基本知识里是最难理解,最难融会贯通 ...

  8. C语言中的移位运算乘法,C语言中 移位操作运算

    移位规律: 左移时总是移位和补零.右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位后补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移.(其实跟扩展逻辑一样 ...

  9. 算术溢出使用4字节值上的运算符_c语言程序设计的数据类型、运算符和表达式介绍...

    数据类型 为什么在用计算机运算时,要指定数据的类型呢?在数学中,数值是不分类型的,数值的运算是绝对准确的,例如:1/3的值是0.333333(循环小数). 而在计算机中,数据是存放在存储单元中的,它是 ...

最新文章

  1. 准备IE--复习NP,NP从头开始,每天学一点,就多一点收获
  2. 网站域名解析端口_Linux Nginx网站服务——2
  3. 精益软件开发简介之A版
  4. MobaXterm无法退格删除,出现^H
  5. 为啥一到年底腾讯市值就大涨??????
  6. JDK演化系列(1.0~~~1.9)
  7. python多个变量的for循环
  8. 程序员的进阶课-架构师之路(5)-队列
  9. Java空指针异常:java.lang.NullPointException
  10. V4L2视频应用程序编程架构
  11. Autodesk 首届云编程马拉松过程纪实和感想
  12. Flutter踩坑之flutter doctor --android-licenses报错
  13. 高薪程序员面试题精讲系列95之数据库的事务了解吗?
  14. 编译原理(1)词法分析程序(C++实现)
  15. MATLAB 各类二维渐变图
  16. FileIO - java
  17. Objective-C学习资源
  18. Homebrew error: Another active Homebrew process is already in progress
  19. 【重磅】马晓东所著的《数字化转型方法论》获“大数据科技传播奖”,与李兰娟等10位院士、BAT高管共获殊荣
  20. JSP如何连接数据库

热门文章

  1. 静态类型语言和动态类型语言
  2. python实现情感分析流程-【转】用python实现简单的文本情感分析
  3. Oracle数据库连接字符串(经典大全)
  4. js 中 数组对象去重
  5. STEAM教育模式:构建快乐、有效的幸福新课堂
  6. jmeter从数据库读取数据作为参数传递给接口
  7. 耦合关系从强到弱顺序_低耦合 高内聚
  8. 关于Mendeley
  9. 吴承恩竟在《西游记》中埋下这么一大伏笔!
  10. #萌新日志#2. 使用BraTS 2020数据集训练nnUNet(多模态和单模态)