补码存储
‘壹’ 计算机为什么采用补码的形式存储数据
主要为了便于运算,不管是正负数的补码,都可以不加任何判断,直接用同个加法器运算。
‘贰’ 计算机中的负数为什么用补码存储
计算机中的负数是为了方便运算,所以计算机才会采用补码存储数据。补码是计算机方便加法运算的编码。例如100(10进制)100/16=6余46/16=0余6。所以100的16进制数是64H以8位二进制来说64H=01100100B正数的补码和原码相同。
所以100的补码还是01100100。
另假设还有个数是-109109的16进制,是01101101-109的原码,就是11101101(首位是符号位)-109的反码,就是10010010(除了符号位其他各位分别取反)。109的补码就是10010011(反码加1)。现在运算100-109=100+(-109)。01100100+10010011=11110111这个结果就是-9的补码。如果换成其他编码运算就不会这么简单了。
例如原码相加的话存在符号位进位的问题等等。对于计算机而言。数值的计算补码是最方便的。
‘叁’ 既然计算机内部数据是以补码存储的,为什么还要有原码呢原码和反码存在的意义是什么 初学者请教大家
正负数据,只是使用补码来存放。
计算机中,并没有原码和反码。
正负数,和补码之间,有个关系式,可以直接互相转换,并不需要绕道原码反码。
原码和反码,可以说,一无是处。
‘肆’ 计算机为什么使用补码来存储数据
补码的功能,类似于:
时针倒拨 3 小时,与正拨 9 小时,效果相同。
利用这种思路,计算机中的负数,也可以改为正数(即补码)。
那么,减法运算,也就可以用加法运算代替了。
因此,利用补码,就能统一加减法,够简化计算机的硬件。
十进制比较容易理解:
25 - 1 = 24
25 + 99 = (一百) 24。
只要忽略进位,+99 就能代替-1。
+99 就称为-1 的补数。
在这里用了 2 位 10 进制。
求补数的算法:补数 = 负数 + 10^2。
通用的公式是:补数 = 负数 + 10^n。n 是位数。
-----------------------
计算机用二进制,补数,就改名为:补码。
一个字节,是 8 位 2 进制。
计数范围是:0000 0000 ~ 1111 1111(十进制 255)。
计数周期是:2^8 = 256。
求补码的算法:负数的补码=负数+2^n。
那么:
-1 的补码=-1 + 256 = 255 = 1111 1111。
-2 的补码=-2 + 256 = 254 = 1111 1110。
。。。
例如,7-2 = 5,用补码计算如下:
7 = 0000 0111
[-2] 补 = 1111 1110
---相加------------
得:(1) 0000 0101 = 5
舍弃进位,结果就完全正确。
借助于补码,负数就没有了,从而就把“减法转换为加法运算”。
-----------------------
补码的来源,与原码反码毫无关系。
“取反加一、符号位也能参加运算”,这些,都没有什么理论依据。
通过原码反码,已经证明“符号位能参加运算”是错误的。
补码能正确运算,并不是什么“符号位也参加运算”。
因为,补码,它就是一个正数,什么符号位也没有。
补码的全部位,都是代表数据的,当然就都可以参加运算。
‘伍’ 为什么数据在内存里是以补码的形式存储
数据在内存里是以补码的形式存储的原因有三点:
1、保证了0的唯一性,保证了数的表示的准确性。
2、让加减可以统一处理,优化了数的运算过程。
3、解决了自身逻辑意义的完整性。
数据在内存里以补码的形式存储是为了简化计算机的结构设计,同时也提高了运算速度。在计算机系统中,数值一律用补码来表示和存储。
(5)补码存储扩展阅读:
补码的主要特性:
补码为一个负整数(或原码)与其补数(或补码)相加,和为模。在补码的运算中,对一个整数的补码再求补码,等于该整数自身。补码的正零与负零表示方法相同。计算机底层不区分无符号数和补码数,可认为其运算全部当作无符号数处理。
补码使得符号位能与有效值部分一起参加运算,从而简化运算规则。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。
参考资料来源:网络-补码
‘陆’ 为什么负数要以补码形式存储
补码的功能类似于:时针倒拨 3 小时,与正拨 9 小时,效果相同。
那么,计算机中的负数,也可以改为正数(即补码)。
同时,减法运算,也就可以用加法运算代替了。
于是,借助于补码,就统一了加减法,就能够简化计算机的硬件。
十进制比较容易理解:
25 - 1 = 24
25 + 99 = (一百) 24。
只要忽略进位,+99 就能代替-1。
+99 就称为-1 的补数。
在这里用了 2 位 10 进制。
求补数的算法:补数 = 负数 + 10^n。
n 是位数。
-----------------------
计算机用二进制,补数,就改名为:补码。
一个字节,是 8 位 2 进制。
计数范围是:0000 0000 ~ 1111 1111(十进制 255)。
计数周期是:2^8 = 256。
求补码的算法:负数的补码=负数+2^n。
那么:
-1 的补码=-1 + 256 = 255 = 1111 1111。
-2 的补码=-2 + 256 = 254 = 1111 1110。
。。。
例如,7-2 = 5,用补码计算如下:
7 =0000 0111
[-2] 补 =1111 1110
---相加------------
得:(1)0000 0101 = 5
舍弃进位,结果就完全正确。
借助于补码,计算机中,就不存在负数了,从而就把减法转换为加法运算。
-----------------------
补码的来源,与原码反码毫无关系。
“取反加一、符号位也能参加运算”,这些,都没有什么理论依据。
通过原码反码,已经证明“符号位能参加运算”是错误的。
补码,它就是一个正数,什么符号位也没有。
补码的全部位,都是代表数据的,当然就都可以参加运算。
‘柒’ 补码二进制计算机为什么要用补码存储整型,关于
借助于补码,就可以用加法,代替减法运算。
所以,计算机使用补码存储数据,就是为了简化硬件。
‘捌’ 类型的存储与最大数最小数,为什么负数补码存储
无论什么类型的十进制数字,在计算机中,都是以二进制存储。
下面按照八位二进制来说明,其它位数,自行脑补。
十进制数 0,存放的,就是二进制 0000 0000。
十进制数 +1,就加上 1,二进制是 0000 0001。
十进制数 +2,就再加 1,二进制是 0000 0010。
。。。
十进制数 +127,加 1加 1...,就加到了 0111 1111。
+127,这就是最大数。
----------
负数怎么办?你就从 0,依次递减吧。
十进制数 0,以二进制 0000 0000 存放。
十进制数 -1,就减去 1,得 1111 1111 = 255(十进制)。
十进制数 -2,就再减 1,得 1111 1110 = 254。
十进制数 -3,就再减 1,得 1111 1101 = 253。
。。。
十进制数 -128,减 1减 1...,得 1000 0000 = 128。
不要再减了,这就是最小值了。
(你再继续减,就是 0111 1111,这就是+127 了。)
因此,最小数就是-128。
----------
总结:
零和正数:直接用二进制存放。
负数:存放形式是【256+这个负数】。
这套存放格式,就是所谓的【补码】。
求【补码】,就是这么简单。
完全不用绕到“原码反码符号位”那么远。
可以用十进制来计算。如果需要二进制,你就再转换一下。
用这个方法,不涉及原码反码符号位,就少了不少麻烦事。
----------
为什么负数用补码存储?
利用补码,可以把减法运算,转换成加法。
(所以,在计算机中,有一个加法器,就够用了。)
例如:6-2 = 4,用补码运算如下:
6 的补码是 0000 0110
+-2 的补码是 1111 1110
-----------------
(1)0000 0100 (= 4 的补码)
(括号中的 1,是进位,舍弃不要了。)
注意:
如果运算结果超出了-128~+127 的范围,结果将是错的。
这种现象称为“溢出”。
再注意一下:进位,并不等于溢出。
---------
因为补码的这个特性,所以,在计算机中,只是使用补码存放数据。
而原码反码,在计算机中,都是不存在的。
原码反码 的用途,仅仅是用于“心算、笔算”。
其实,笔算的方法,并非只有“取反加一”。
另外,-128,有补码,但是却没有原码反码!
用“取反加一”来求-128 的补码,无异于缘木求鱼。
所以,大家,完全不必在原码反码 上浪费时间精力。
但是,考试怎么办?
呃 ...,还是别跟老师较劲,他怎么讲,你就怎么答吧。
‘玖’ 关于汇编里数据(补码)的存储问题!
用汇编语言编程,-10,或
246,都是编译成
F6H,再存储到计算机。
计算机,不管它是
-10,还是
246,它就是《存着》而已。
这个数字,就等着你来编写指令来处理。
你使用了无符号的数据处理方法,计算机就拿它当做
246。
你使用了有符号的数据处理方法,计算机就拿它当做
-10。
‘拾’ 计算机为什么用补码存储数据
补码的功能,类似于:
时针倒拨 3 小时,与正拨 9 小时,效果相同。
利用这种思路,计算机中的负数,也可以改为正数(即补码)。
同时,减法运算,也就可以用加法运算代替了。
那么,借助于补码,就能统一加减法,够简化计算机的硬件。
十进制比较容易理解:
25 - 1 = 24
25 + 99 = (一百) 24。
只要忽略进位,+99 就能代替-1。
+99 就称为-1 的补数。
在这里用了 2 位 10 进制。
求补数的算法:补数 = 负数 + 10^2。
通用的公式是:补数 = 负数 + 10^n。n 是位数。
-----------------------
计算机用二进制,补数,就改名为:补码。
一个字节,是 8 位 2 进制。
计数范围是:0000 0000 ~ 1111 1111(十进制 255)。
计数周期是:2^8 = 256。
求补码的算法:负数的补码=负数+2^n。
那么:
-1 的补码=-1 + 256 = 255 = 1111 1111。
-2 的补码=-2 + 256 = 254 = 1111 1110。
。。。
例如,7-2 = 5,用补码计算如下:
7 =0000 0111
[-2] 补 =1111 1110
---相加------------
得:(1)0000 0101= 5
舍弃进位,结果就完全正确。
借助于补码,负数就没有了,从而就把“减法转换为加法运算”。
-----------------------
补码的来源,与原码反码毫无关系。
“原码反码取反加一、符号位也能参加运算”...
这些,都没有什么理论依据。
从“取反加一”来学习补码,就弄不清楚“为什么用补码”。