为什么使用补码

转自: http://blog.sina.com.cn/s/blog_56d8ea900100y6nl.html

1.为什么使用补码形式:
  其实计算机中的数值用补码来表示,一是为了防止0有2个编码,其次就是为了把减法运算用加法运算表示出来,以达到简化电路的作用(因为有了负数的概念,减法可以换算为加法)。具体内容请参看一些专业书籍,比如华中科技大出版的《逻辑设计》(呵呵,我大二的课本)。
  为什么用补码表示有符号整数。比如8位整数表示的范围是-128~127,而不是-127~128呢?想过没有,为什么二进制10000000在原码和反码中表示0,在补码中它不表示0,保证了0表示的唯一性,但是它为什么表示负数,而不是整数,你也许会说,因为它符号位是1呀,表示负数呀,对,继续,+128我们用补码怎么表示,包括符号位,表示为010000000,超过了2个字节,如果截取低8位,那么是10000000,最高位(符号位)是1,表示的是一个负数,我们再看看-128的机器码是多少,原码110000000,反码101111111,补码110000000,截取低8位即10000000,表示的是一个负数。
其实呀,这些总结出来的东西都是玩巧,也并不是说非要这样实现,学了计算机逻辑原理,就知道,其实这样做是由于物理条件关系。因为运算器里这样做更容易实现计算。  
2.
int x=-70;
int y=2;
int z=x>>y
z的值是多少?主要是不明白负数移位该怎么算?
在C语言中 int 是两个字节所以 70在计算机中表示为 0000 0000 0100 0110
-70用补码表示即 1111 1111 1011 1010
右移2位 C语言中采用的是算术右移
所以补进位和原符号位相同即 1111 1111 1110 1110
取反加一求它的相反数 0000 0000 0001 0010 等于 17
所以右移后的结果是 -17
有个规则如果左移1位相当于乘以2 右移1位相当于除以2 取整
我们验证一下用-70除以2*2 结果取整正好是我们推算的 -17
在C++中 int 是四个字节但是结果也是一样的原因自己可以推算一下
3. 在8位运算中65-15具体怎么通过补码计算啊~~~
15的原码是0000 1111 补码也是0000 1111
因为是正数符号位(最高位)为0

-15的原码是1000 1111(←注意这个地方你弄错了)符号为为1表示负
反码就是 1111 0000(注意原码反码补码之间转换的时候千万不要把符号位考虑进去) 补码就是 1111 0001
如果你已经求出了15的补码这里有个简便的方法求-15的补码:
直接把15的补码包含符号位一起求反即可即
15补码 1111 0001 那么-15的补码 0000 1110

补码计算的时候符号位是要直接参与二进制运算了而不是单独考虑
所谓多余8位的进位舍去其实就是比如补码1111 1111再加任意非0数原来这个补码表示的数就会发生溢出(比如加上 0000 0001原先符号位1表示负数加后表示正数)
这里也许你觉得没有必要因为本身只能容纳8位多余的当然要舍去
可是你可能不知道如果是反码进行运算的话不是舍去多余进位而是把多余的进位加到最低位称为循环进位

4。补码溢出如何处理
这就要看你处理数据的范围,比如我用8位二进制记录数据。
只能储存-128~127之间的数据,如果超过127或小于-128就会溢出。
比如127+1=-128 就是这个道理
就好象最大值和最小值连成了一个环,超过了循环计算
这样做才使得数据有规律性和周期性
为了实现这个所以 补码是舍掉进位 而反码是循环进位 前面说过了
解决的办法就是 如果8位的数据不过你就用16位的
如果 整型不够就用长整型撒 实在不行就用浮点型的

时间: 2024-11-08 17:46:42

为什么使用补码的相关文章

原码、反码、补码

原码.反码.补码,计算机中负数的表示 1.表示范围 拿单字节整数来说,无符号型,其表示范围是[0,255],总共表示了256个数据.有符号型,其表示范围是[-128,127]. 先看无符号,0表示为0000 0000,255表示为1111 1111,刚好满足了要求,可以表示256个数据. 再看有符号的,若是用原码表示,0表示为0000 000.因为咱们有符号,所以应该也有个负0(虽然它还是0):1000 0000. 那我们看看这样还能够满足我们的要求,表示256个数据么? 正数,没问题,127是

计算机基础知识_原码反码补码

一.原码,反码,补码 1.原码 比如一个二进制数字 最高位是0,(0代表正数) 0010 1000 那么原码就是0010 1000 反码: 0010 1000 补码: 0010 1000 都是一样的,这个二进制数字的10进制是40 所以是正数 正数的原反补都是一样的 2.反码 反码就是原码的取反,二进制的 0变为1 1变为0 ,看最高符号位是0 还是1,如果是1,则你要0变为1,1变为0, 3.补码: 负数的的是原码 取反 在加1 变成补码(二进制数) 正数的原码 加上负数的补码就等于是做减法运

原码 反码 补码

出处来自:http://blog.csdn.net/liushuijinger/article/details/7429197 原码: 如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1.剩下的n-1位表示概数的绝对值. 例如: X=+101011 , [X]原= 00101011    X=-101011 , [X]原= 10101011 位数不够的用0补全. PS:正数的原.反.补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0.

java基础:原码反码补码

计算机在操作的时候,都是采用数据对应二进制的补码来计算的: 原码 反码 补码 原码:用原码,反码,补码来分别表示+7,和-7. 首先得到7的二进制:111

基础之——原码、反码、补码 详解

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计

原码, 反码, 补码 详解

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计

C语言之原码、反码和补码

原码.反码和补码 1).数据在内存中存储的时候都是以二进制的形式存储的. int num = 10; 原码.反码.补码都是二进制.只不过是二进制的不同的表现形式. 数据是以补码的二进制存储的. 2). 1个int类型的变量.在内存中占据4个字节, 32位. 00000000 00000000 00000000 00000000 在不考虑正负的情况下.1个int类型的变量可以表示接近43e种数据. 为了可以表示正负性.使用最高为来表示这个数的正负性. 如果最高为是0 那么表示这个数是1个正数 如果

进制转换与原码补码

进制也就是进位制,是人们规定的一种进位方法. 我们先来回想一下生活中的十进制: (1) 数码: 指集合论中刻画任意集合所含元素数量多少的一个概念 十进制的基本符号是:0.1.2.3.4.5.6.7.8.9:我们把这些称为十进制的数码:也就是基本符号,所有的十进制都是有这十个数码组成的.每位在加时都是"逢十进一". (2) 位权: 数制中每一固定位置对应的单位值称为位权 那么大家考虑一个问题,说一个十进制数,已知第四位是5,其它位都是0,那么这个数是几?答案:5000,怎么算的是5*10

Java之&0xff用法解析以及原码、反码、补码相关知识

char强转至int为什么使用0xff? 备注:在Java中采用补码形式表示二进制 如果不希望进行符号扩展,可以采用与操作.例如char c:int i = c & 0xffff:其中,char有8位,int类型有32位,采用32/8=4个f(即0xffff)做与操作,即可屏蔽符号扩展. //负整数时,前面输入了多余的 FF ,没有去掉前面多余的 FF,按并双字节形式输出System.out.println(Integer.toHexString(-2).toUpperCase());//FFF

[转]原码, 反码, 补码 详解 很全

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计