转自:http://blog.csdn.net/wenhui_/article/details/7071993
负数在计算机中如何表示?
举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢?
很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。
但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用2的补码(Two's Complement)表示负数。
什么是2的补码?
它是一种数值的转换方法,要分二步完成:
第一步,每一个二进制位都取相反值,0变成1,1变成0。比如,00001000的相反值就是11110111。
第二步,将上一步得到的值加1。11110111就变成11111000。
所以,00001000的2的补码就是11111000。也就是说,-8在计算机(8位机)中就是用11111000表示。
不知道你怎么看,反正我觉得很奇怪,为什么要采用这么麻烦的方式表示负数,更直觉的方式难道不好吗?
为什么要用2的补码
首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能够保持一一对应的关系,就可以用任意方式表示负数。所以,既然可以任意选择,那么理应选择一种最方便的方式。
2的补码就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电路完成。
还是以-8作为例子。
假定有两种表示方法。一种是直觉表示法,即10001000;另一种是2的补码表示法,即1 1111000。请问哪一种表示法在加法运算中更方便?
随便写一个计算式,16 + (-8) = ? 1 0001000 取反 1 1110111 加1 +1 = 1 1111000 再取反 1 0000111 + 1 = 1 0001000 取反不不包括符号位两次取反得到原值 正数的补码是其本身 负数的补码是符号位不变 其他位取反之后加1
连着变换两次相当于没有做任何操作
16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:
00010000
+10001000
---------
10011000
可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。
现在,再来看2的补码表示法。
00010000
+11111000
---------
100001000
可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,2的补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。
2的补码的本质及正确性
我们要看先一下模的概念
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范
围,即都存在一个“模”。例如:
时钟的计量范围是0~11,模=12。
表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的
余数。任何有模的计量器,均可化减法为加法运算。
例如: 假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:
你可以往回拨4个小时,也可以向前拨8个小时(12-10+6,在钟表系统里模是12)
在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。
对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特
性。共同的特点是两者相加等于模。
对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大数是11111111,若再
加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的
模为2^8。 在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以
了。
再次重申一下这句话:
在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。
所以对于模为10000 0000的8位系统来说,减去b和加上10000 0000-b是一个道理,而(10000 0000-b)是什么?恰好就是b的补码
补码怎么求,“取反加一” 这口诀怎么来的?
承认了8 - 5 = 8 + (-5的补码)这个事实后,我们来看-5的补码怎么求,“取反加一”怎么来的
其实看完了上面的模的问题,该问题的答案基本已经出来了
-5的补码是 10000 0000 - 5 = 1111 1111 + 1 -5 = (1111 1111 - 5) + 1
1111 1111减去一个数事实上就是在对这个数取反,后面那个是+1
两个小问题的解释:
(1)
32位系统里,int的最大值为01111111 11111111 11111111 11111111,加1之后为
10000000 00000000 00000000 00000000。这个数是什么?
首先这是个负数-->负数在计算器里都是补码形式存放-->这是个补码-->那么真值是?--> -2147483648(已知负数的补码求该负数,不会求的百度一下吧。。。)
(2) 再取反就得到原来的值
对于unsigned,最大值(32个1)加1后最前面的1自然丢失,剩下32个0,所以就是0。
分享到:
相关推荐
2. 正数和零的补码与原码相同。 3. 负数的最高位(符号位)总是1。 4. 如何在STC51单片机的指令集内进行补码运算。 5. CH451接口程序的具体用法和功能,包括可能的输入/输出参数和返回值。 这个压缩包中的代码可能...
本程序是关于STC5A60S2的十进制负数求补码的源程序,会对大家有所帮助
这个过程可能包括了对二进制字符串的位操作,如位移、与、或、异或等,以确保负数的正确表示。 在Delphi中,可以使用StrToInt、IntToStr函数进行整数和字符串间的转换,而IntToHex和HexToInt则用于十六进制和整数...
正数的补码与原码相同。例如,+9 的补码是 00001001。 负数的补码 负数的补码求法是:符号位不变,数值位各位取反,最后整个数加 1。例如,-5 的补码是 11111011。 补码的特点 补码有以下几个特点: * 补码可以...
- **反码到补码**:与原码到补码类似,负数的反码加1得到补码,正数不变。 - **补码到原码**:若最高位为0,补码即为原码;若为1,说明是负数,将其余位取反后加1得到原码。 - **补码到反码**:对于负数,补码的非...
在本压缩包文件"vi.zip_16进制补码_Labview 进制_labview 二进制_labview补码_二进制补码"中,主要探讨的是在LabVIEW环境下进行16进制数值与二进制补码之间的转换和计算。 首先,我们来理解一下什么是进制。进制是...
总之,这个Java基础教程通过讲解字节、负数的补码表示以及与128相关的计算,旨在帮助初学者建立起对计算机底层数据表示的深刻理解。这些基础知识不仅对于学习Java,也对于其他编程语言的学习和计算机系统的理解有着...
在计算机科学和数字电子技术中,原码和补码是两种表示二进制数的方法,尤其是在处理负数时。原码直接用最高位作为符号位,0代表正,1代表负,其余位表示数值的绝对值。补码则是用来表示负数的一种方式,它的特点是...
减法在二进制系统中的实现通常涉及到补码的概念,因为二进制补码是一种用于表示负数的方法。补码运算不仅用于减法,还用于无符号数的加法和比较操作。在二进制减法中,我们经常需要将减法转换为加法,通过加上负数的...
补码的表示方法是在原码的基础上进行修改,原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为 0,负数该位为 1(0 有两种表示:+0 和-0),其余位表示数值的大小。 二、补码的表示和转换 ...
标题“mul.zip_原码与补码”涉及到了计算机中处理带符号数的关键概念——原码和补码。这两个术语与二进制数的正负表示有关,尤其在进行算术运算时,如乘法,它们扮演着至关重要的角色。 原码是数字的直接二进制表示...
原码、反码和补码是计算机系统中表示和存储负数的基本概念。由于计算机采用二进制数表示数据,它必须能够准确表示正数和负数。在计算机系统中,整数通常按照补码形式存储,这能够简化加法和减法的硬件实现,并使得二...
- **补码**:正数的补码与原码相同;负数的补码是其反码的基础上再加1。 #### 三、原码详解 **1. 定义** 原码是一种最基本的二进制表示方式,它直接表示数值本身,其中最高位为符号位。例如,在8位二进制中,+1的...
补码的获取方式对于本篇内容不是重点,但简单来说,一个正数的补码就是其本身,而一个负数的补码则是将该数按位取反后加1得到的结果。例如,在8位二进制系统中,数字-5(原码为10000101)的补码是11111011,通过取反...
正数的补码与原码相同,负数的补码是其反码的基础上最低位加1。例如,-7的反码11110000B,其补码是11110001B。补码的主要优势在于可以将减法转化为加法,因为对于负数,补码表示的是其真值的相反数加上模(这里是256...
补码的计算规则是:正数的补码与源码相同,即正数的补码是其本身;负数的补码,是对其源码(除符号位)取反再加一,于是得到其补码。 例如,-7的源码:1_111;-7的补码:1_001;正数的补码被定义为其本身,所以不需...
正数的反码与原码相同,而负数的反码是将原码除符号位外的各位取反(0变1,1变0)。例如,+5的反码仍然是***,而-5的反码是***。 3. 补码:补码是计算机中应用最为广泛的编码形式,它解决了原码在运算中的不足。...
在二进制表示法中,正数的补码与原码相同;而负数的补码则是通过对该数的绝对值取反后再加1获得。补码的主要优点在于简化了计算机中的算术运算,尤其是加减运算。 #### 三、补码求取方法 **1. 方法一:取反加一法**...
微机原理与应用:第三讲 补码和相关实验.ppt 本资源主要讲解了微机原理与应用的第三讲,内容涵盖了原码、反码和补码的定义、性质和缺陷,以及它们在计算机系统中的应用。 一、原码 原码是机器数的最基本形式,...
正数的补码就是其原码,而负数的补码则是除了最高位(符号位)为1之外的所有位取反,然后加1。例如,-5的八位二进制补码表示为11111011,因为-5的原码(不包括符号位)是0101,取反后变为1010,再加1得到1011,由于...