ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[转]关于负数的左右位移运算 - 雾漫大武汉 - 博客园

2022-07-23 17:32:45  阅读:152  来源: 互联网

标签:10 运算 符号 博客园 补码 负数 雾漫大 原码


先备知识:

关于负数是如何在内存中是如何存储的?

在计算机内存当中,负数一律按照补码的形式进行存储,例如现在有一个负数-10

-10的二进制原码形式为

[1000 1010]2 这个地方需要注意的是高位为符号位,即当这个数字是负数的时候高位为1,正数时高位为0,且符号为不计入数值当中,只能表示正负数的概念。

当-10存入计算机当中的时候,内存中需要对负数的原码进行按位取反加一的操作,即进行求补码的操作;特别注意,符号位不参与变化

[1111 0110]2

当需要将负数从内存当中取出的时候,首先需要将补码转化成原码,转变规则为对当前的补码取反加一(其中符号为不参与变化),转变的原码为:

[1000 1010]2

 

负数左移位运算相关操作: 

以-10举例首先进行左移2位运算(-10<<2):

1)-10的补码形式为:

[1111 0110]2

2)向左移动2位,右端补0得到新的补码为:

[1101 1000]2

3)将当前补码从内存中取出,取出时需要将补码转化成原码形式:

[1010 1000]2

4)通过换算可得[2 8]16加上符号即为[-40]10

 

负数右移位运算相关操作:

仍然是以-10来举例,将-10右移2位(-10>>2):

1)确定-10的补码形式为:

[1111 0110]2

2)向右移动2位,高位补符号位,说人话就是符号位是几就补几:

[1111 1101]2

3)转化为原码形式取出(取反加一,符号位为不动):

[1000 0011]2

4)计算出来的结果为[0 3]16加上符号得出[-3]10

 

总结:

左移运算一律在右端补0,右移运算一律在左端补符号数(负数符号位为1就补1,正数符号位为0就补0)

特别注意的是:

负数是不能在原码的基础上进行操作的,需要首先转化成补码才能进行移位运算,并且运算的结果并不是直接结果,还是需要将其转化为原码才能当做运算结果输出!

其中不要忘记了加上负号!

 

补: 

特别注意溢出问题:负数移位溢出之后的值一律为-1,正数移位溢出之后的值一律为0

有时间再补上溢出问题。


---------------------
作者:雾漫大武汉
来源:CNBLOGS
原文:https://www.cnblogs.com/oldfish123/p/14941113.html
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

标签:10,运算,符号,博客园,补码,负数,雾漫大,原码
来源: https://www.cnblogs.com/builderx/p/16512522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有