数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制;
在八位二进制下,-128不能用原码或反码表示,反码只能表示0到127,-0到-127;
用补码表示为:10000000
在八位整数里原码的取值范围为-127到+127,反码也是;在八位二进制中就把-0当作最小数-128用,也就是10000000
-0的原码:10000000
-0的反码:11111111
-128的补码:10000000
扩展资料
小数原码
[X] =
X( 0≤X <1 )
1- X (-1 < X ≤ 0)
例如: X=+0.1011 , [X]原= 0.1011
X=-0.1011 [X]原= 1.1011
整数原码
[X]原 =
X (0≤X <2(n-1))
2(n-1)-X (- 2(n-1) < X ≤ 0)
x为正整数时,[X]原=x;
x为负整数时,[X]原=2的n次方-x;
x为负小数时,[X]原=1-x;
参考资料:百度百科 反码
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助!
在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.
1、机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
那么,这里的 00000011 和 10000011 就是机器数。
2、真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111] 即 [-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
在开始深入学习前, 我的学习建议是先"死记硬背"上面的原码, 反码和补码的表示方式以及计算方法.
现在我们知道了计算机可以有三种编码方式表示一个数. 对于正数因为三种编码方式的结果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
所以不需要过多解释. 但是对于负数:
[-1] = [10000001]原 = [11111110]反 = [11111111]补
可见原码, 反码和补码是完全不同的. 既然原码才是被人脑直接识别并用于计算表示方式, 为何还会有反码和补码呢?
首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (真值的概念在本文最开头). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.
于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.
为了解决原码做减法的问题, 出现了反码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.
于是补码的出现, 解决了0的符号以及两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)
使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].
因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
本人一直不善于数学, 所以如果文中有不对的地方请大家多多包含, 多多指点!
作者: 张子秋
出处: http://www.cnblogs.com/zhangziqiu/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
本回答被网友采纳在计算机系统中,数值,一律采用补码表示和存储。
这就是说:计算机,既不使用原码反码,也不存储它们。
所谓的“原码和反码”,只不过是计算机专家编造的【障眼法】而已。除了用来蒙唬初学者,什么用都没有。
所谓“补码”,其真正的来源是【舍弃进位】,而并非是什么“取反加一”。
你看十进制数,两位就是:0 ~ 99。
随便算一个:27 + 99 = (一百) 26
你也可以这么算:27 - 1 = 26
如果你忽略进位,这两种算法的功能,就是相同的。
此时,正数,就能当负数使用,加法,也就能完成减法运算!
在计算机中舍弃进位,负数和减法,自然就都没有了,减法器,当然也就用不着了!
计算机中,只配置一个加法器,便可横行天下!
·
八位二进制数是:0000 0000 ~ 1111 1111。
相当于十进制数:0 ~ 255。
出现进位,就是:2^8 = 256。
那么,加上 255 (1111 1111),再舍弃 256,当然就是-1 了。
同理,+254 (1111 1110),就是-2。
。。。 。。。
最后,+128 (1000 0000),就是-128。
以上这 128 个正数,就是计算机专家发明的“补码”。
即:正数 128 ~ 255,就能代表负数-128 ~ -1。(必须舍弃进位,它们才是负数。)
而:加上 0 ~ 127,并不能产生进位,它们也就不能表现出负数的特点。
即:零和正数 0 ~ 127,就只能代表它们自己了。
·
计算机专业教材上给出的补码定义式,如下:
这个定义式,也就充分表现出了上述规律。
若字长为 8,书上的定义式,就可以简化为:
● [ X ]补 = X ……………… 0 ~ +127,
● [ X ]补 = 256 + X …… -128 ~ -1。
例:求-31 的补码是什么?
解:[-31 ]补 = 256-31 = 225 = 1110 0001B。 完事!
利用定义式,直接就可以求得:正负数值的补码。
机器数符号位原码反码取反加一,这些都是障眼法,都是用不着的。
进位、舍弃进位,不过就是小学的知识点而已。
如果计算机专家好好上个小学,就不用整出那么多不存在的概念了。
计算机的原码,反码,补码是怎么回事?可以举例说明吗?
原码、反码和补码是计算机中对数字二进制的三种表示方法。1、原码 原码(trueform)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。例如:用8位二进制表示一个数,...
什么是补码原码和反码
计算机中的符号数有三种表示方法,即原码、反码和补码,具体如下:1、原码。就是二进制定点表示法,原码表示法在数值前面增加了一位符号位,正数该位为0,负数该位为1,其余位表示数值的大小,即最高位为符号位,0表示正,1表示负,其余位表示数值的大小。2、反码。是数值存储的一种,多应用于系统...
补码,原码,反码什么的。有什么作用啊!
反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反 举例:int类型的 3 的反码是 00000000 00000000 00000000 00000011 和原码一样没什么可说的 int类型的 -3 的反码是 11111111 11111111 11111111 11111100 除开符号位,所有位,取反 解决了加减运算的问题,但还是有正负零之分,...
反码原码补码什么意思
反码、原码和补码是计算机中用来表示有符号整数的三种编码方式。1、定义 反码、原码和补码是计算机中用来表示有符号整数的不同编码方式。它们是为了解决在计算机中对正负数进行运算和表示时的一些特殊情况而提出的。2、原码 原码是指将一个整数的绝对值转换为二进制,并在最高位上标记符号位。正数的符号位...
原码反码和补码有什么区别?
正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。正数的补码就是其本身,负数的补码是在其原码的基础上符号位不变,其余各位取反, 最后+1(即在反码的基础上+1)。正数的原码,反码,补码都一样。原码(true form)是一种计算机中对数字的二进制定点表示方法。原码...
什么是原码、反码、补码?
机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。①...
计算机中的原码,补码,反码是什么意思?
计算机中的原码、补码、反码是表示有符号整数的三种不同编码方式。原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。例如,对于8位二进制数来说,正数+7的原码为00000111,负数-7的原码为10000111。原码的优点是简单直观,但进行加减运算时较为麻烦,因为计算机中的加减运算都是基于...
计算机中原码,补码,反码,是什么?
原码:就是原码,真实的码 反码:在原码的基础上,符号位不变,数值位按位取反 补码:1)正数的补码:与原码相同。【例1】+9的补码是00001001。(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反然后整个数加1。
什么是原码、反码、补码?
原码:正整数的原码:这个数的二进制,符号位为0;正整数的原码=补码=反码 例1:+66 66的二进制:1000010,所以+66的原码: 0 1000010 =补码: 0 1000010=反码: 0 1000010 负整数的原码:仍是这个数的二进制,符号位为1;负整数的原码、反码、补码计算:先求原码,再求反码,最后...
反码补码原码是什么意思
在计算机中,数字通常以原码、反码和补码的形式来表示,这些表示方法都是为了方便计算机进行二进制运算和处理。1、原码 原码是一种最简单的二进制表示方法,用于表示整数和浮点数,直接将数值的二进制形式作为原码,正数的原码与其二进制形式相同,负数的原码则在其二进制表示前面添加一个负号。2、反码 反码...