逻辑移位和算术移位

逻辑移位:移位产生的空位由0来补充,比如11100右移移位变为01110

算术左移同逻辑移位。

算术右移有两种可选的方案:左边移入的位由0补充,或者由符号位来补充,这两种实现依赖于编译器。11100右移移位结果可能是01110或者11110。

在程序中尽量不使用有符号数的右移操作,这样会使得程序的可移植性变差。

对于有符号数右移,下面的代码可以判断编译器采用的逻辑右移还是算术右移

# include <iostream>
# include <cstdlib>
using namespace std;

int main()
{
	int a=0xfffffffe;
	a>>=1;
	if(a==-1)
		cout<<"算术移位"<<endl;
	else
		cout<<"逻辑移位"<<endl;

	system("pause");
	return 0;
}

由于有符号数左移操作会把符号位移掉,然后在最右边加上0,这可能会使得一个负数变成一个正数。

下面的程序说明了这一点。

# include <iostream>
# include <cstdlib>
using namespace std;

int main()
{
	int a=0x80000001; //a<0
	cout<<a<<endl;
	a<<=1;
	cout<<a<<endl;   //a>0
	system("pause");
	return 0;
}
时间: 2024-10-12 21:15:09

逻辑移位和算术移位的相关文章

算术移位和逻辑移位实现分析

参考:http://blog.sina.com.cn/s/blog_944790400101bsi8.html http://www.feiesoft.com/asm/05-2-05.html unsigned int i = 8; int main() { i = i<<3;//输出结果i = 64 } 请问:上面的变量i是采用逻辑移位还是算术移位呢? 逻辑移位,简单理解就是物理上按位进行的左右移动,两头用0进行补充,不关心数值的符号问题. 算术移位,同样也是物理上按位进行的左右移动,两头用

重拾C之语句,操作符和表达式

1.C中的if语句和其他语言的If语句中,只存在一个差别,c并不具备布尔类型,而是用整型来代替,这样,括号中的式子可以是任何可以产生整型结果的表达式,c中的关系操作符的结果是整型0或1 2.break和continue语句的任何一条如果出现在嵌套的循环内部,它只是对最内层的循环起作用,你无法使用break或continue语句影响外层循环的执行 3.空语句 while((ch = getchar())!=EOF && ch != '\n') ; 这种形式清楚地显示了循环体是空的,而不至于使

移位操作及其在数据类型转换中的作用

一.对移位操作的基本概述: 1.什么样的数据类型可以直接移位 char.short.int.long.unsigned char.unsigned short.unsigned int.unsigned long都可以进行移位操作,而double.float.bool.long double则不可以进行移位操作. 2.有符号数据类型的移位操作 对于char.short.int.long这些有符号的数据类型: 对负数进行左移:符号位始终为1,其他位左移 对正数进行左移:所有位左移,即 <<,可能

20145311 《信息安全系统设计基础》第三周学习总结

教材学习内容总结 浮点数编码是表示实数的科学计数法的以二为基数的版本,浮点运算是不可结合的小端方式:低对低,高对高浮点数的编码方式与整型数据的二进制形式适当移位会有若干个相匹配的位序列只要一个与非门,就可以完成所有的逻辑运算掩码可以将特定位置1,可以置0,将位向量与相应的掩码作与运算就可以利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算有符号数和无符号数的转换:数值可能会改变,但是位模式不会改变(区分有符号无符号数还是依靠人的解释,也就是依靠上下文)当参与运算时,如果一个

第五章 - 计算机组成

计算机的组成部分可以分为三大类:中央处理单元(CPU),主存储器,输入/输出子系统. 中央处理单元:算术逻辑单元(ALU),控制单元,寄存器组. 算术逻辑单元:对数据进行逻辑(与,或,非,异或),移位(逻辑移位和算术移位)和算术运算. 寄存器:用来存放临时数据的高速独立的存储单元.(数据寄存器,指令寄存器,程序计数器) 控制单元:控制各个子系统的操作. 主存储器:他是存储单元的集合,每一个存储单元都有唯一的标识,称为地址.数据以称为字的位组的形式在内存中传入和传出.字可以是8位,16位,32位,

C++移位运算符

关于逻辑移位.算术移位可參见迅雷深大笔试题部分.的一道题. 曾经看到C++标准上说,移位运算符(<<.>>)出界时的行为并不确定: The behavior is undefined if the right operand is negative, orgreater than or equal to the length in bits of the promoted left operand. 我当时也没有深究过这个问题.前几天有个网友来信问起这件事,我才发现,这和Intel

运算符和表达式(类型转换)

和其他程序设计语言一样,C语言中表示运算的符号称为运算符.运算符是告诉编译程序执行特定算术或逻辑操作的符号,运算的对象称为操作数. 对一个操作数进行运算的运算符称为单目运算符,对两个操作数进行运算的运算符称为双目运算符,三目运算符对三个操作数进行运算.用运算符和括号可以将操作数连接起来组成表达式. C语言提供了40多个运算符,其中一部分跟其他高级语言相同(例如"+"."?"."*"等运算符),另外的与汇编语言类似,对计算机的底层硬件(如指定的物理

计算机组成原理-第二版-唐朔飞著-课后习题详解

第1章 计算机系统概论 1. 什么是计算机系统.计算机硬件和计算机软件?硬件和软件哪个更重要?解:P3计算机系统:由计算机硬件系统和软件系统组成的综合体.计算机硬件:指计算机中的电子线路和物理装置.计算机软件:计算机运行所需的程序及相关资料.硬件和软件在计算机系统中相互依存,缺一不可,因此同样重要. 2. 如何理解计算机的层次结构?答:计算机硬件.系统软件和应用软件构成了计算机系统的三个层次结构.(1)硬件系统是最内层的,它是整个计算机系统的基础和核心.(2)系统软件在硬件之外,为用户提供一个基

16位汇编第六讲汇编指令详解第第三讲

                                          16位汇编第六讲汇编指令详解第第三讲 1.十进制调整指令 1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 2.分成压缩BCD码和非压缩BCD码调整 简而言之: 以前的时候你有个手表,里面的数字是九,如果加一个1就是0了,就会产生进位, 不过这个是10进制进位的,所以应该是 a了,但是a的话就出错了.所以我们就出来了这个调整指令直接变为零,然后进位,也就是16进制码当做10进制使用