补码的延伸,复制别人的

【复制来的】http://blog.csdn.net/jjhua/article/details/50382563:连接;为了搞明白为什么8进制补码表示范围-128~+127,原码和反码表示范围-127~+127,也就是为什么会有-128的差别。

综合了But_Bueatiful博文 C语言关于补码的解释及误区 和百度知道计算机中补码的符号位可以不做特别对待而直接参加运算。求其证明过程。有些心得。

先抄一段博文里的内容用于理解模和补数的概念:

模、补数
在日常生活当中,可以看到很多这样的事情:
把某物体左转 90 度,和右转 270 度,在不考虑圈数的条件下,最终的效果是相同的;
把分针倒拨 20 分钟,和正拨 40 分钟,在不考虑时针的条件下,效果也是相同的;
把数字 87,减去 25,和加上 75,在不考虑百位数的条件下,效果也是相同的;
……。
上述几组数字,有这样的关系:
  90 + 270 = 360
  20 + 40 = 60
  25 + 75 = 100
式中的 360、60 和 100,就是“模”(也可以理解成“进制”)。
式中的 90 和 270、20 和 40,以及 25 和 75,就是一对对“互补”的数字。

知道了“模”,求某个数字的“补数”,就是轻而易举的了:
如果模为 365,数字 120 的补数为:365 - 120 = 245。

用补数代替原数,可把减法转变为加法。出现的进位就是模,此时的进位,就应该忽略不计。

二进制数的模
前面说过的十进制数 25 和 75,它们是 2 位数的运算,模是 100,即 1 的后面加上 2 个 0。
如果有 3 位数参加运算,模就是 1000,即 1 的后面加上 3 个 0。
这里的 1000,是十进制数的一千,可以写成 10^3,即 10 的 3 次方。
推论:有多少位数参加运算,模就是在 1 的后面加上多少个 0。

对于二进制数字,模也是这样推算。
如果是 3 位二进制数参加运算,模就是 1000,即 1 的后面加上 3 个 0;
那么当 8 位二进制数参加运算,模就是 1 0000 0000,即 1 的后面加上 8 个 0。
16 位二进制数参加运算,模可就大了,是 1 的后面加上 16 个 0。
注意:这里提到的 1、0,都是二进制数。
8 位二进制数的模可以按照十进制写成 2^8,即 256。
16 位数二进制数的模,就是 2^16,按照十进制,它就是 65536。

再抄一段百度知道内容用于理解如何快速计算负数的补码

可以想像一下,有个小孩子,很小,不很识数,只认识 0 ~ 99,还不会做减法。
教这样的小孩做减法,就可以告诉他:-1,可以用+99来代替。

24 - 1 = 23
24 + 99 = (1)23

忽略进位,是不是就是一样的?

那么,98,就是-2;
97,就是 -3;
……
50,就是 -50。
看明白这些,就可以理解了《补码定义式》。
--
对于八位的二进制数,是 0 ~ 1111 1111(255);
255,就是 -1;
254,就是 -2;
……
128,就是-128。
这就是按照《补码定义式》,求出来的《负数的补码》。
而 0~127,按照《补码定义式》,就是《正数的补码》。

总结:

所以存在补码定义式:

[X]补 = X                   当 X 大于等于0 时
[X]补 = 模 - |X|      当 X 小于 0 时

举例说明:

八位二进制 ,注意:没有符号位,全部作为数据位,则最大值为八个1即 1111  1111B,那么模即为 1  0000  0000B,也就是最大值+1,十进制值为256

零和正数的补码即为十进制转为二进制的结果,如0 的补码 0000 0000B  ,+127的补码 0111  1111B

负数的补码即为 负数的补数 的二进制形式,负数的补数=模-|负数|

举例求-3的补码:

-3的补数=256-3=253  ,转换为二进制1111  1101,此即为-3的补码。

可以通过书上讲的原反补过程验证一下,-3的原码是1000 0011 ,反码是除符号位以外取反结果为1111 1100 ,补码是反码+1,最终结果即为1111 1101,与上面结果一致。

做两个算术运算:

假设前提8位二进制。

分别计算  5-3  和   3-5  两个式子结果,结果用补码表示。

5-3 即为  5+(256-3)= 258 = 1 0000 0010B,抛弃超出的高位1,结果为 0000 0010B,很明显为2的补码

3-5 即为 3+(256-5)= 254 = 1111 1110B,按书上原反补计算方法,-2原码1000 0010B 反码1111 1101B 补码1111 1110B,一致。

时间: 2024-10-31 10:45:44

补码的延伸,复制别人的的相关文章

复制别人的虚拟机须知

1,要改mac地址,复制来的机器mac地址通常一样,这样的话相互之间是不可以通信的. 改地址是首先是要在外部通过虚拟机软件诸如virtualbox之类的设置的,如果这一步不做的话,反正我是折腾半天也没有成功:其次是要更改 /etc/sysconfig/network-scripts/ifg-eth0中的mac地址hwaddr,改成和之前外部设置的相同,ifg-eht0可能名字未必是这个,ifconfig看一下: /etc/udev/rules.d/70-persistent-net.rules这

类似百度搜索的下拉提示框,复制别人的,改了一下。

jsp代码:在填写上级公司的input框时需要给客户提示已经保存过的相似公司名称,所以在下面加一个id为append的空的div. <div class="row cl"> <label class="form-label col-xs-4 col-sm-2" style="text-align: right;">上级公司:</label> <div class="formControls co

关于oralce字符集问题(复制别人的,纯属自己学习)

本文主要讨论以下几个部分: 1.如何查看查询oracle字符集. 2.修改设置字符集以及常见的oracle utf8字符集 3.oracle exp 字符集问题 正文: 一.字符集参数 影响Oracle数据库字符集最重要的参数是NLS_LANG参数. 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言.地域和字符集),每个成分控制了NLS子集的特性. 其中: Language: 指定服务器消息的语言, 影响提示信息是中文还是英文 T

mysql5.6.25编译安装步骤(这是我复制别人的,方便查看)

原文地址:https://www.cnblogs.com/netsa/p/7088494.html 简略步骤: mysql5.6.25编译安装步骤: 下载mysql准备用户和组yum安装依赖解压mysqlcmake编译mysqlmake && make install ----时间约10分钟mysql安装目录权限设置数据库初始化拷贝配置文件root密码重置,原来是没密码的远程账户授权设置服务启动和开机启动  ======实战==============================#安装

【命令cp】linux cp复制命令参数及用法详解

cp (复制档案或目录)[[email protected] ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[[email protected] ~]# cp [options] source1 source2 source3 -. directory参数:-a :相当于 -pdr 的意思:-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身:-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询

使用Notepad++快速有效删除复制代码中的行号

转载:http://plum.0602.blog.163.com/blog/static/1130006502011101524120757/ 试了该方法,很好用! 为什么我把用Notepad++删除代码行号称作“快速”和“有效”呢? 其一,作为要常常分享和求取代码的编程人员来说,复制别人的代码可能将代码行号一起复制了,要想在编译器里运行,得一个一个删除行号,因此用Notepad++,只需一步便可以删除所有行号,其所谓“快速”(前提是按以下步骤配置Notepad++的自带插件). 其二,遇到问题

复制、移动和删除:cp, rm, mv

要复制文件,请使用cp(copy)命令.不过,cp命令的用途很多.除了单纯的复制之外,还可以建立连接文件(就是快捷方式),比较两个文件的新旧而予以更新,以及复制整个目录等等.至于移动目录与文件,则使用mv(move),这个命令也可以直接用来重命名(rename).删除使用rm(remove)命令.下面我们就来看一看. cp(复制文件或目录) [[email protected] ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination)[[email p

linux cp命令参数及用法详解---linux 复制文件命令cp

linux cp命令参数及用法详解---linux 复制文件命令cp [[email protected]Linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[[email protected]linux ~]# cp [options] source1 source2 source3 -. directory参数:-a :相当于 -pdr 的意思:-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身:-

解决屏幕上图片闪烁的问题 复制DC的问题

本文对最近在使用双缓冲画图遇到的问题进行一个总结.(复制别人的写的挺好) 双缓冲是画图中使用频繁的手法,用于防止绘图闪烁的问题. 使用框架: CDC m_memDC; //初始化兼容的内存DC    m_memDC.CreateCompatibleDC(pDC);    CBitmap m_bmpWave; //创建设备兼容的位图缓冲    if(!m_bmpWave.CreateCompatibleBitmap(pDC,m_bmpwidth,m_bmpheight))    {