原码、补码、反码、有符号数、无符号数概念

原码、补码、反码、有符号数、无符号数概念
原码、补码、反码、有符号数、无符号数概念

原码、补码、反码、有符号数、无符号数

https://www.360docs.net/doc/b54514522.html,

原码、补码和反码

在计算机里如何表示整数?

整数有无穷多个,在计算机里,通常我们只能表示出其中的一部分。假如我们用n 个比特来表示一个整数。1 个比特有 2 个状态,n 个比特就有 2^n 个状态,把这 2^n 个状态的集合记为 A. 显然,用A,我们可以与 n 个整数建立起一一对应。我们还希望 A 所表示的整数能够象整数那样地运算---整数,象整数那样运算,这是不是一句废话?数学中的整数相加,仍然是一个整数,但 A 里两个整数相加,我们却无法保证它们的和仍在 A 中,用代数的术语来讲,叫做"不满足封闭性",这是个很坏的性质。

一、补码

不过数学上有处理这个问题的成熟方案,如果我们能后退一步,让 A 表示的是模 |A| 的剩余类,则加法运算马上就封闭了。而且这个时候 A 不仅可以与 2^n 个整数对应起来,而且,在某种意义下,可以与整数环 Z 对应起来。用代数的观点,这个"某种意义"就是所谓的同态。

整数有两种封闭运算,一种是加法,另一种是乘法。A 作为模 2^n 的剩余类,也有加乘两种运算。定义 Z 到 A 的映射

f(x) = m mod 2^n

f 是一个同态,也就是说,f 满足这样的良好性质:

f(x+y) = f(x) + f(y)

f(xy) = f(x)f(y)

我们通常使用 10 进制数,在这个进制下,f(x) 并不容易计算,但是在计算机里,本质的表示是二进制,于是 f(x) 的运算变得出奇地简单。如果 x 小于 2^n,则x 的 2 进制表示就是 f(x),如果 x>=2^n,则要求其模 2^n 的余数,这恰好是x 二进制表示的最低 n 位,换句话说,简单地把高位抛弃就行了。顺便指出,f(0)=0, f(1)=1.

我们来看一看 A 中的加法,f(x)+f(y), 若结果小于 2^n,则运算自然封闭,如果f(x)+f(y) >= 2^n,则取其最低的 n 位,用电路实现时,可以简单地扔掉高位,保留低位。

到目前为止,一切都很好,但是减法怎么办呢?对整数运算而言,减去 a 不过是加上 a 的相反数的同义语。只要对 A 中的每个元素,能容易计算出其相反数就可以了。理论上 f(x) 的相反数就是

f(-f(x))

不过这个好像不容易计算,因为我们现在并没有给出 A 中"负数"的概念,事实上 A 是模 2^n 的剩余类环,根本就没有所谓的负数。

这个困难也是容易处理的。作为 f(x) 的相反数,-f(x) 应该满足这样的性质:

-f(x) + f(x) = f(0) = 0

所以我们只要有在 A 中找一个元素,使得它与 f(x) 的和是 0 就可以了。但是f(x) 本身可能含有很多比特1,加上一个数能使它们变成 0 吗?考虑到 A 中的加法要模去一个 2^n,这个问题实际上很好办,只要让求出的和是 2^n 就可以了。所以难发现 -f(x) 就是把 f(x) 的比特"取反"---即 0 变1, 1 变0,并加上 1 就得到了 -f(x)。容易验证:

f(-x) = - f(x).

现在我们回过头来看前面的一句话,红色部分:

"我们通常使用 10 进制数,在这个进制下,f(x) 并不容易计算,但是在计算机里,本质的表示是二进制,于是 f(x) 的运算变得出奇地简单。如果 x 小于 2^n,则 x 的 2 进制表示就是 f(x),如果 x>=2^n,则要求其模 2^n 的余数,这恰

好是 x 二进制表示的最低 n 位,换句话说,简单地把高位抛弃就行了。顺便指出,f(0)=0, f(1)=1."

红色那句话简直是胡扯,因为没有考虑到负数的情况。但 f(x) 容易计算这句话

并没有错,因为当 x 为负数时,我们可以利用 f(x) = -f(-x)。由于 -x 是正的,f(-x) 容易计算,之后 -f(x) 也不过是取反加 1 而已。

好,到目前为止---在数学世界里,简直是完美的。但是回到现实, A 里头真的没有负数,怎么办?整数能比较大小,A 里头的数又怎么办?

这时候,我们可以用一个不太完美的方案,把 A 里头的元素再映射回整数 Z 中,如果只需要无符号的数,则变换为

g(u) = u, 0<= u <2^n-1

其实就是不把 A 中的元素模 2^n 的剩余类,而直接看成整数。不过这时的运

算就要考虑溢出了。如果是无符号的情形,运算的结果仍是模 2^n 的余数,外加一个溢出标志。

如果要考虑负数,如果没有特别的理由,则要求正负个数大致相等是自然的。可以考虑让 0 代表0, 1~2^{n-1}-1 代表正数,2^{n-1}+1~2^n-1 代表负数。丢掉一个 2^{n-1} 是因为希望正数和负数刚好配对,若 u 代表负数,则其落在

2^{n-1}+1~2^n-1 中,但它代表负几呢?当然是负 -u 了。从两个相反数之和为0 ,或 2^n 的观点,-u 就是 2^n-u, 而 u 则是 -(-u) 即 u-2^n。

2^{n-1} 是个麻烦,在 A 中,它的相反数就是自己,把它当正数,负数都不大

合理。出于完整性考虑,随便选一个好了。在这里我们让 2^{n-1} 为负数,理

由是它的最高位是1,跟其它"负数"长得比较象。

换个角度看,模 n 的剩余类,或者余数为0,1,...,2^{n-1}, 2^{n-1}+1, ..., 2^n-1. 这些余数也可以表示为:

0,1~2^{n-1}, 2^n-(2^{n-1}-1), ..., 2^{n}-1

我们刚才所做的就是把上面数列中 2^{n} -r (1<= r<= 2^{n-1}-1)类型的的数对应为负数 -r 而已。用代数的术语,就是在陪集中选取了不同的代表元。

于是我们定义 A 到 Z 的变换,使得

当0<= u <= 2^{n-1} 时,g(u) = u

当2^{n-1}

当然,这时运算起来有可能溢出,但结果仍可以看成模 2^n 的余数,外加一个溢出标记。

上面所说的就是补码。

二、反码

抽象地看,反码与补码只有一个区别,同样的 n 比特状态集合A,反码让这些元素表示模 2^n-1 的剩余类,而补码模 2^n。于是从 Z 到 A 的映射定义为

f(x) = x mod 2^n-1

不过且慢,A 的大小是 2^n,而模 2^n-1 的余数只有 2^n-1 个?是的,这是反码一个不完美的地方,它浪费了全 1 的码字,不过我们可以把全 1 的和全 0 的数看成一样的。

f 同样是个环同态,满足

f(x+y) = f(x) + f(y)

f(xy) = f(x)f(y)

俄且 f(0)=0, 或者全1, f(1) = 1.

f(x) 可以计算如下,设

x = 2^n q + r,

则由于2^n = 1 mod (2^n-1),所以

x = q + r (mod 2^n -1)

若然 q+r 仍大于等于 2^n,则递归使用上述步骤。当然也可以直接去模 2^n-1,但上面的处理充分利用了二进制表示。而且当 x 为负数时,我们有两外的处理方法,见后面相反数的部分。

f(x) 能求出后,A 中的加法运算和乘法运算也就容易处理了,若 f(x)+f(y)<2^n,则不作特别处理,如果 f(x)+f(y) >=2^n,则结果为 f(f(x)+f(y)) 即把第 n+1 比特加到最低比特上。对于乘法,f(x)f(y) 可以多出n-1 位,处理方法是把第 n+i 比特加到第 i 比特上,或者说把高出 n 位的比特都右移 n 位并加在低位上, 如果仍然越界,则重复上述步骤。从这里可以看到反码的一个弱点,它的越界处理比较麻烦,而补码直接把越界的位丢掉就是了。

A 中的相反数如何求?-f(x) + f(x) = f(0) = 0, 加出一个全零比较难办,但加出一个全 1 不是问题,所以我们可以让 -f(x) 为 x 的取反,即 0 变成1, 1 变成0。于是求相反数的问题解决了。

同样,我们可以考虑在反码中引入正数,负数,这个与补码的类似,这里就不多说了。

有趣的是 2^n 几乎不可能是素数,而 2^n-1 有可能. 2^n-1 形的素数称为梅森素数。如果 2^n-1 是素的,则 A 中非零元素都可求逆。那么对应于 32 位和 64 位计算机的,将会是 31 位计算机和 61 位计算机,看上去很不错嘛,期待中。

三、原码

这个没有什么可说的,2^n 个状态直接表示0~2^n-1,如果要引入负数,则让最高位为 1 的表示负数, 所以 0x 代表x,而 1x 代表 -x.

原码最好的地方是它简单,最不好的地方在于它没有良好的代数结构。

-------------------------------------------------------------------------

补码的原理及随想

越早在课堂上学的东西,越给我以简单的印象,忘得也越快。而事实上,它们往往是最富有智慧的,即便在我没忘的时候,也没有深刻地理解它们。

嘛是补码?不少书上扯一堆“取反加1”之类的规则,很不着重点,我觉得核心在于:

对于范围为[0,M)的整数计量系统,其模为M。和为M的两个数互为补数。

如果有两个整数a,b∈[0, M),那么f(a-b)==f(a+c),其中c= M-b,是b的补码, f是一个映射,定义为:

当0 <=x < M时,f(x)=x;

当x>= M时,f(x)=x % M;-------->此时就要消除溢出

当x <0时,f(x)=f(M +x).

其中%为取余运算(效果同编程语言中的取模运算)。

在计算机中,f是由溢出隐式实现的,所以天生就有a-b==a+c。这就把减运算转化成了加运算。

于是,为了便于执行减运算,计算机就把-b表示为其补码c。

假设机器字有n位,那么M=2n,c=2n-b。

人在纸上怎么计算2n-b的二进制值?2n的原码就是1后面跟了n个0,直接用它减b的原码不方便,先用2n-1的原码(n个1)减b的原码,得到的结果加上1就是2n-b的值了——这就是“取反加1”的由来。

------------------------------------------------------------------------------------

有符号数,无符号数

同样是年纪和工资,前者不需要有负值,但后者可能需要——至少所有的老板都这样认为。

那么,负数在计算机中如何表示呢?

这一点,你可能听过两种不同的回答。

一种是教科书,它会告诉你:计算机用“补码”表示负数。可是有关“补码”的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切。再者,用“补码”表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以和答案?

另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是0,表示正数,最高位是1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是错的。至少它不能解释,为什么字符类型的-1用二进制表示是“1111 1111”(16进制为FF);而不是我们更能理解的“1000 0001”。(为什么说后者更好理解呢?因为既然说最高位是1时表示负数,那1000 0001不是正好是-1吗?)。

让我们从头说起。

1、你自已决定是否需要有正负。

就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。

在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值),称为无符类型。

数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。

字符类型也分为有符和无符类型。

比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。

2、使用二制数中的最高位表示正负。

首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。

(红色为最高位)

单字节数:1111 1111

双字节数:1111 1111 1111 1111

四字节数:1111 1111 1111 1111 1111 1111 1111 1111

当我们指定一个数量是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。

当我们指定一个数量是无符号类型时,此时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。

3、无符号数和有符号数的范围区别。

无符号数中,所有的位都用于直接表示该值的大小。有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比:

无符号数:1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20有符号数:0111 1111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。

不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比:

无符号数:0 ----------------- 255

有符号数:-128 --------- 0 ---------- 127

同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128。所以二者能表达的不同的数值的个数都一样是256个。只不过前者表达的是0到255这256个数,后者表达的是-128到+127这256个数。

一个有符号的数据类型的最小值是如何计算出来的呢?

有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位(见第3点)。但在负值范围内,数值的计算方法不能直接使用1* 26 + 1* 25的公式进行转换。在计算机中,负数除为最高位为1以外,还采用补码形式进行表达。所以在计算其值前,需要对补码进行还原。这些内容我们将在第六章中的二进制知识中统一学习。

这里,先直观地看一眼补码的形式:

以我们原有的数学经验,在10进制中:1 表示正1,而加上负号:-1 表示和1相对的负值。

那么,我们会很容易认为在2进制中(1个字节): 0000 0001 表示正1,则高位为1后:1000 0001应该表示-1。

然而,事实上计算机中的规定有些相反,请看下表:

二进制值(1字节) 十进制值

1000 0000 -128

1000 0001 -127

1000 0010 -126

1000 0011 -125

... ...

1111 1110 -2

1111 1111 -1

首先我们看到,从-1到-128,其二进制的最高位都是1(表中标为红色),正如我们前面的学。

然后我们有些奇怪地发现,1000 0000 并没有拿来表示 -0;而1000 0001也不是拿来直观地表示-1。事实上,-1 用1111 1111来表示。

怎么理解这个问题呢?先得问一句是-1大还是-128大?

当然是 -1 大。-1是最大的负整数。以此对应,计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:1111 1111

表示-1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,在一字节中,最小的负值是1000 0000,也就是-128。

我们以-1为例,来看看不同字节数的整数中,如何表达-1这个数:

字节数 二进制值 十进制值

单字节数 1111 1111 -1

双字节数 1111 1111 1111 1111 -1

四字节数 1111 1111 1111 1111 1111 1111 1111 1111

-1

可能有同学这时会混了:为什么 1111 1111 有时表示255,有时又表示-1?所以我再强调一下本节前面所说的第2点:你自已决定一个数是有符号还是无符号的。写程序时,指定一个量是有符号的,那么当这个量的二进制各位上都是1时,它表示的数就是-1;相反,如果事选声明这个量是无符号的,此时它表示的就是该量允许的最大值,对于一个字节的数来说,最大值就是255。

来自: https://www.360docs.net/doc/b54514522.html,/confidentphilosopher/blog/item/ffad60d15fdff6db572c840c.html

真值原码反码补码详解和习题

原码、反码和补码的概念 本节要求 掌握原码、反码、补码的概念 知识精讲 数值型数据的表示按小数点的处理可分为定点数和浮点数;按符号位有原码、反码和补码三种形式的机器数。 一.计算机中数据的表示方法 1、数的定点与浮点表示 在计算机内部,通常用两种方法来表示带小数点的数,即所谓的定点数和浮点数。 ①定点数:是小数点在数中的位置是固定不变的数,数的最高位为符号位,小数点可在符号位之后,也可在数的末尾,小数点本身不需要表示出来,它是隐含的。 缺点:只有纯小数或整数才能用定点数表示; ②浮点数:小数点在数中的位置是浮动的、不固定的数。 一般浮点数既有整数部分又有小数部分,通常对于任何一个二进行制数N,总可以表示成:N=±2P×S N、P、S均为二进制数, P为N的阶码,一般为定点整数,常用补码表示,阶码指明小数点在数据中的位置,它决定浮点的表示范围 S为N的尾数,一般为定点小数,常用补码或原码表示,尾数部分给出了浮点数的有效数字位数,它决定了浮点数的精度,且规格化浮点数0.5≤|S|<1; 0.1B=( 1/2 )D =( 2-1)D 0.11B=(1/2 + 1/4 )D =( 2-1+2-2)D 0.111B=(1/2 + 1/4 + 1/8 )D =( 2-1+2-2+2-3)D --------------------------- 在计算机中表示一个浮点数其结构为: 假设用八个二进制位来表示一个浮点数,且阶码部分占4位,其中阶符占一位;尾数部分占4位,尾符也占一位。 若现有一个二进制数N=(101100)2可表示为:2110×0.1011,则该数在机器内的表示形式为:101100B= 10110B * (21)D 101100B= 1011B * (22)D 101100B= 101.1B * (23)D 101100B= 10.11B * (24)D 101100B= 1.011B * (25)D 101100B= 0.1011B * (26110 一个浮点形式的尾数S若满足0.5≤|S|<1,且尾数的最高位数为1,无无效的0,则该浮点数称为规格化数;规格化数可以提高运算的精度。 S为原码表示,则S1=1 规格化数 S为补码表示N为正数,则S1 =1 N为负数,则S1=0

C语言有符号数与无符号数之间的转换

C语言有符号数与无符号数之间的转换 无符号数:不存在正负之分,所有位都用来表示数的本身。 有符号数:最高位用来表示数的正负,最高位为1则表示负数,最高位为0则表示正数。 1.无符号数--->有符号数 看无符号数的最高位是否为1,如果不为1(为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。 以unsigned char 和char为例子: 1.1将无符号数2转为有符号数 2的原码是:0000 0010,可知最高位不为1,因此转为有符号数之后也是2。 程序: 1 #include 2 3int main(void) 4{ 5 unsigned char i = 2; 6 7 printf("%d/n",(char)i); 8 9return0;10} 运行结果: 1.2将无符号数130转为有符号数 130的原码是:1000 0010,可知最高位为1,因此需要取它的补码,补码为1111 1110,这是一个负数,取最高位作为-号,取最低7位作为数值得到的结果是-126。 程序: 1 #include 2 3int main(void) 4{ 5 unsigned char i = 130; 6 7 printf("%d/n",(char)i); 8 9return0;10 } 运行结果: 2.有符号数--->无符号数 看有符号数的最高位是否为1,如果不为1(为0),则无符号数就直接等于有符号数;如果有符号数的最高位为1,则将有符号数取补码,得到的数就是无符号数。 以char 和unsigned char为例子: 2.1将有符号数3转为无符号数 3的原码是:0000 0011,可知最高位不为1,因此转为无符号数之后也是3。 程序: 1 #include 2 3int main(void) 4{ 5char i = 3; 6 7 printf("%u/n",(unsigned char)i); 8 9return0;10 } 运行结果: 2.2将有符号数-7转为无符号数 -7的原码是:1000 0111,可知最高位为1,因此需要取它的补码,补码为1111 1001,这是一个正数,因此整个数的值就是249。 程序: 1 #include 2 3int main(void) 4{ 5char i = -7; 6 7 printf("%u/n",(unsigned char)i); 8 9return0;10 } 运行结果:

原码、反码和补码

原码:一个整数在内存中占二字节,规定高位字节的最左边一位为最高位,表示数的符号(0 正1负),其余各位代表数本身的绝对值。 如:+8的原码0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 - 8的原码 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 +0的原码0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0的原码 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 反码:正数的反码与原码同,负数的反码规定符号位不动,其余各位对原码取反 如:- 8的反码 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 - 0的反码 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 补码:正数的补码同原码,负数的补码为它的反码加1 如:- 8的补码 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 - 0的补码0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0的补码0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 负数补码的补码是它的原码。 已知有一带符号数,其二进制表示为 1111 1111 1001 0111 计算它的值= -? 理解:“一个负数补码的补码就是它的原码”。即:“负数的负数是它本身” 记-x = 1111 1111 1001 0111,求x (1111 1111 1001 0111)反+ 1 = (0000 0000 0110 1000) + 1 = (0000 0000 0110 1001) =(69)16 = 6*16+9 = 105 故:1111 1111 1001 0111 为-105 为什么负数采用补码表示法? 用补码表示数时,0的代码是唯一的; 优化加法与减法运算,加减时不必考虑符号位,与数值位同样参与 运算; 带符号与无符号的混合相加; 加减法的统一(在二进制中,求补码(所有位取反加1)即取负运算)1111 1111 1111 1101 + 0000 0000 0000 0101 (-3)+(+5)=(2)1 0000 0000 0000 0010 反码运算结果不符

进制转换及原码反码补码练习题

进制转换练习题 【例题1-1】十进制数1000对应二进制数为______,对应十六进制数为______。 供选择的答案 A:①1111101010 ②1111101000 ③1111101100 ④1111101110 B:①3C8 ②3D8 ③3E8 ④3F8 【例题1-2】十进制小数为0.96875对应的二进制数为______,对应的十六进制数为______。 供选择的答案 A:①0.11111 ②0.111101 ③0.111111 ④ 0.1111111 B:①0.FC ②0.F8 ③0.F2 ④0.F1 【例题1-3】二进制的1000001相当十进制的______,二进制的100.001可以表示为______。 供选择的答案 A:①62 ②63 ③64 ④65 B:①23+2–3②22+2–2③23+2–2④22+2–3 【例题1-4】十进制的100相当于二进制______,十进制的0.110011相当二进制的______。 供选择的答案 A:①1000000 ②1100000 ③1100100 ④1101000 B:①2–1+2–2+2–4+2–5②1–(2–3+2–4) ③1+(–2–3–2–4) ④1–2–3–2–4–2–6 【例题1-5】八进制的100化为十进制为______,十六进制的100化为十进制为______。 供选择的答案 A:①80 ②72 ③64 ④56 B:①160 ②180 ③230 ④256 【例题1-6】在答案群所给出的关系式中正确的为______,在给出的等式中不正确的为______。 供选择的答案 A:①0.1112<0.7510②0.78>0.C16

原码、反码、补码详解

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有 不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 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位二进制数的取值范围就是:

理解C语言有符号数和无符号数

声明网上看到的文章,原文找不到了,原文被转载的不成样子,重复很多,整理花了很长时间,在翻看了维基百科后发现,原文中对于负数原码和补码存在一些问题,修改了一部分,原作者看到后可以联系我。 1、你自已决定是否需要有正负。 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型。(unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。字符类型也分为有符和无符类型。比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。 2、使用二制数中的最高位表示正负。 首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。 (红色为最高位) 单字节数:11111111 双字节数: 11111111 11111111 四字节数:11111111 11111111 11111111 11111111 当我们指定一个数量是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。 当我们指定一个数量是无符号类型时,此时,最高数称为“符号位”。为1时,表示该数

为负值,为0时表示为正值。 3、无符号数和有符号数的范围区别。 无符号数中,所有的位都用于直接表示该值的大小。有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比: 无符号数:11111111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20 有符号数:01111111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20 同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。 不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比: 无符号数:0 ----------------- 255 有符号数:-128 --------- 0 ---------- 127 同样是一个字节,无符号的最小值是0 ,而有符号数的最小值是-128。所以二者能表达的不同的数值的个数都一样是256个。只不过前者表达的是0到255这256个数,后者表达的是-128到+127这256个数。 一个有符号的数据类型的最小值是如何计算出来的呢? 有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位(见第3点)。但在负值范围内,数值的计算方法不能直接使用1* 26 + 1* 25 的公式进行转换。在计算机中,负数除为最高位为1以外,还采用补码形式进行表达。所以在计算其值前,

带符号数的原码、反码与补码分析

一.带符号数的原码、反码与补码 所谓带符号数,其实就是一个二进制数据,它的最高位所代表的是符号,其余位是其“绝对值”。例如0101_0011,这个数据如果是带符号数,那么最高位的0就是代表这个数据为正数,其后的101-0011则代表这个数据的绝对值,为+83D。如果是1101_0011,则代表-83D。 1.1 原码 原码就是按照正数的符号位为0,负数的符号位为1,其他位就是数据的绝对值即可。例如当机器字长为8bit的二进制数时,它的最高位为符号位,因此其余的7bit位数据的绝对值。因此原码所能表示的数据范围是: - (2n-1-1)~+(2n-1-1) 当字长为8bit,则原码能表示的范围就是:-127~+127 例如83的原码就是:0101_0011 当字长为16bit,则原码能表示的范围就是:-32767~+32767 例如-83的原码就是:1000_0000_0101_0011 1.2 反码 对于一个带有符号位的二进制数来说,正数的反码与其原码相同,负数的反码为其原码除符号位外其余各位按位取反。 例如当字长为8bit时,+83D的反码就是:0101_0011,-83D的反码就是1010_1100 负数的反码与原码有很大的差别,一般情况下,反码主要用来当做求二进制数补码的中间形式。反码所表示的数据范围与原码相同: - (2n-1-1)~+(2n-1-1) 1.2 补码 正数的补码与其原码相同,负数的补码为其反码在最低位加1。 例如: X=+101_1011 [X]原码=0101_1011 [X]补码=0101_1011 X=-101_1011 [X]原码=1101_1011 [X]补码=1010_0101 补码表示的范围是: - 2n-1~+(2n-1-1)

无符号数、有符号数、原码、反码、补码——数据在计算机内部的表示

数据在计算机内部的表示与存储 作者:刘英皓 2013/4/17 今天在做单片机实验的时候,突然对一个问题产生了浓厚的兴趣:数据在计算机内部是怎么表示的?晚上查阅了大量的资料,终于把其中的玄机弄明白了。 资料来源甚广,在此就不一一声明了,感谢!! 数据是什么?它是用来表示信息的。是信息的载体。比如数值、文字、语言、图形、影像等都是不同形式的数据。而在计算机中,无论是数值型数据还是非数值型数据,它们都被表示成了0和1。 既然都变成了0和1,那计算机怎么区别这些不同的信息呢?别担心,它们各在有各自的编码规则。非数值型数据的编码主要有ASCII 码和汉字编码。这里不深究。 数值型数据:它主要有两种形式,有符号数和无符号数 1、有符号数和无符号数 它们的定义估计你都听腻了,我就不重复了,我只强调两点: a.计算机不区分有符号数和无符号数。 b.只有有符号数才有原码、反码和补码。 2、原码、反码和补码 还是两点:

a.正数的原码、反码和补码都一样。 b.负数的反码为原码除符号位的按位取反,补码为反码加1. 注意两点: b1.反码1111 1111的补码是0000 0000. b2.补码1000 0000没有对应的原码和反码,它表示-128,这是规定 3、计算机存储单元中的数据 这个要分两种情况: a.无符号数:直接以对应的二进制表示。 b.有符号数:补码形式表示,无论是计算还是存取。 比如在内存单元中有一个数据为FEH,那么它到底是表示什么?254还是-2?没关系,你说是什么就是什么。因为计算机是不会区分这个数是有符号数还是无符号数的。在你写程序的时候,指定这个量是有符号的,FEH就是一个补码,可以计算得它的真值就是-2,如果指定它是无符号的,那么它就是254。不同的形式在程序中便会有不同的体现。要注意的是在计算中不要超出了数值的范围,以免发生错误。 如有疑问请联系:yinghao1991@https://www.360docs.net/doc/b54514522.html,

原码、反码与补码知识讲解

2.2 原码、反码与补码 在计算机内的数(称之为“机器数”)值有3种表示法:原码、反码和补码。所谓原码就是带正、负号的二进制数,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。由此可见,这三种表示法中,关键是负数的表示方式不一样。 2.2.1 正负数表示、定点数与浮点数 在计算机内,通常把1个二进制数的最高位定义为符号位,用“0”表示正数,“1”表示负数;其余位表示数值。 规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮动的数称为“浮点数”。 2.2.2 原码 原码表示法是定点数的一种简单的表示法。用原码表示带符号二进制数时,符号位用0表示正,1表示负;数值位保持不变。原码表示法又称为符号-数值表示法。 1. 小数原码表示法 设有一数为x,则原码表示可记作[x]原(下标表示)。例如,X1= +1010110 ;X2= -1001010 原码表示数的范围与二进制位数有关。设二进制小数X=±0.X1X2…Xm,则小数原码的定义如下: 例如:X=+0.1011时,根据以上公式可得[X]原=0.1011;X=-0.1011时,根据以上公式可得[X]原= 1-(-0.1011)=1.1011=1.1011 当用8位二进制来表示小数原码时,其表示范围为:最大值为0.1111111,其真值约为(0.99)10 ;最小值为1.1111111,其真值约为(-0.99)10。根据定义,小数“0”的原码可以表示成0.0…0或1.0…0。 2. 整数原码表示法 整数原码的定义如下: 例如:X=+1101时,根据以上公式可得[X]原=01101;X=-1101时,根据以上公式可得[X]原=24-(-1101)=10000+1101=11101 当用8位二进制来表示整数原码时,其表示范围为:最大值为01111111,其真值为(127)10 ;最小值为11111111,其真值为(-127)10 。同样,整数“0”的原码也有两种形式,即00…0和10…0。 2.2.3 反码 用反码表示带符号的二进制数时,符号位与原码相同,即用0表示正,用1表示负;数值位与符号位相关,正数反码的数值位和真值的数值位相同;而负数反码的数值位是真值的数值位按位变反。 1. 小数反码表示法 设二进制小数X=±0.x1x2…xm,则其反码定义为: 例如,X=+0.1011时,根据以上公式可得[X]反=0.1011;当X=-0.1011时,根据以上公式可得[X]反=2-2-4+X=10.0000-0.0001-0.1011=1.0100。根据定义,小数“0”的反码有两种表示形式,即0.0…0和1.1…1。 2. 整数反码表示法 设二进制整数X=±Xn-1Xn-2…X0,则其反码定义为: 例如,X=+1001时,根据以上公式可得[X]反= 01001;当X=-1001时,根据以上公式可得[X]反= (25-1)+X= (100000-1)+(-1001)= 11111-1001=10110 同样,整数“0”的反码也有两种形式,即00…0和11…1。

128的二进制有原码反码和补码 (1)

第一次修订 2009-5-6 14:11 --------------------- 1.模的概念(我只讲个例子,具体的可以查数学中的 "同余模") 在日常生活中,有许多化减为加的例子。例如,时钟是逢12进位,12点也可看作0点。 当将时针从10点调整到5点时有以下两种方法: 1.将时针逆时针方向拨5格,相当于做减法: 10-5=5 2.将时针顺时针方向拨7格,相当于做加法:10+(12-5)=12+5=5 (模为 12) 2.模的运用(采用模得到补码) 1.补码的得来:是为了让负数变成能够加的正数,so,负数的补码=模-负数的绝对值 比如:-1 补码:1111 1111(10000 0000 -1得来) 当一个数要减1的时候,可以直接加 1111 1111 2.原码的得来:(负数的原码,直接把对应正数的最高位改为1) 原码能够直观的表示一个负数(能直观的把真值显示出来,如 -1为1000 0001 其中最高位表示符号位,不进行算术计算) 3.总结:补码相加,到第9位才舍弃(模10000 0000) 原码相加,到第8位舍弃(模1000 0000) 反码相加,到第8位舍弃(模1000 0000) 3.原码和补码之间转换: 1.补码=原码减1,再取反(便于理解) 或补码= 反码+1(便于描述和推理) 2.演示:补码=原码减1,再取反 如-1的原码1000 0001-->1000 0000(减1后)-->1111 1111(取反后)补码 3.演示:补码= 反码+1) 如-1的原码 1000 0001-->1111 1110(反码)-->1111 1111(加1)补码 4.重点:(特别是在有进位的时候) 原码和反码的最高位是符号位,不参加算术运算,模为1000 0000(比补码少一个0) 而补码所有位都可以相加,模为10000 0000(最高位不是符号位,补码是通过模减去负数绝对值得到的) 5.推断-128的原码和补码(用补码= 反码+1) 1.关于原码1000 0000,表示的是-0,还是-128呢?(答案是-128而不是-0) 1.先看看原码的概念吧:正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值 2.0是负数吗?0既不是正数也不是负数,那么它的符号位到底是0还是1呢?(0的符号位为0,不能为1)

什么是原码反码补码

什么是原码反码补码 1100110011 原 1011001100 反除符号位,按位取反 1011001101 补除符号位,按位取反再加1 正数的原反补是一样的 ◆一个正数的补码和其原码的形式相同。 如果定义了一个整型变量i: int i;/*定义为整型变量*/ i=lO;/*给i赋以整数10*/ 十进制数10的二进制形式为1010,在微机上使用的C编译系统,每一个整型变量在内存中占2个字节。 图2.2(a)是数据存放的示意图。图2.2(b)是数据在内存中实际存放的情况。 图2.2 ◆求负数的补码的方法是:将该数的绝对值的二进制形式,按位取反再加1。 例如求-10的补码:①取-10的绝对值10;②10的绝对值的二进制形式为1010; ③对1010取反得1111111111110101(一个整数占16位);④再加1得1111111111110110,见图2.3。

整数的16位中,最左面的一位是表示符号的,该位为0,表示数值为正;为1 则数值为负。 北桥,南桥是主板上芯片组中最重要的两块了.它们都是总线控制器.他们是总线控制芯片.相对的来讲,北桥要比南桥更加重要.北桥连接系统总线,担负着cpu 访问内存的重任.同时连接这AGP插口,控制PCI总线,割断了系统总线和局部总线,在这一段上速度是最快的.南桥不和CPU连接通常用来作I/O和IDE设备的控制.所以速度比较慢.一般情况下,南桥和北桥中间是PCI总线. 1。南桥和北桥芯片主要区别是什么? 南桥主要是负责IO 北桥用于CPU和内存、显卡、PCI交换数据 2。如何巧妙辨别南桥和北桥芯片? 用功能辨别南桥芯片和北桥芯片: 北桥 它主要负责CPU与内存之间的数据交换,并控制AGP、PCI数据在其内部的传输,是主板性能的主要决定因素。随着芯片的集成度越来越高,它也集成了不少其它功能。如:由于Althon64内部整合了内存控制器;nVidia在其NF3 250、NF4等芯片组中,去掉了南桥,而在北桥中则加入千兆网络、串口硬盘控制等功能。现在主流的北桥芯征的牌子有VIA、NVIDIA及SIS等。 当然这些芯片的好坏并不是由主板生产厂家所决定的,但是主板生产商采取什么样的芯片生产却是直接决定了主板的性能。如:同样是采用VIA的芯片,性能上则有KT600>KT400A>KT333>KT266A等。目前主流的AMD平台上,可选的芯片组有:KT600、NF2、K8T800、NF3等;对于INTEL平台,则有915、865PE、PT880、845PE、848P等。 南桥 南桥芯片主要是负责I/O接口等一些外设接口的控制、IDE设备的控制及附加功能等等。常见的有VIA的8235、8237等;INTEL的有CH4、CH5、CH6等;nVIDIA 的MCP、MCP-T、MCP RAID等。在这部分上,名牌主板与一般的主板并没有很大的差异,但是名牌主板凭着其出色的做工,还是成为不少人的首选。而不排除一部分质量稍差的主板为了在竞争中取得生存,可能会采用功能更强的南桥以求在功能上取胜。 用芯片在主版上的位置辨别南桥芯片和北桥芯片: 北桥芯片就是位于和CPU插槽附近的一块芯片,其上面一般都覆盖了散热片

有符号数与无符号数

1、你自已决定是否需要有正负。 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。 在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值),称为无符类型。 数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。 字符类型也分为有符和无符类型。 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。 2、使用二制数中的最高位表示正负。 首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。 (红色为最高位) 单字节数:1111 1111 双字节数:1111 1111 1111 1111 四字节数:1111 1111 1111 1111 1111 1111 1111 1111 当我们指定一个数量是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。 当我们指定一个数量是无符号类型时,此时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。 3、无符号数和有符号数的范围区别。 无符号数中,所有的位都用于直接表示该值的大小。有符号数中最高位用于表示

正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比: 无符号数: 1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20 有符号数: 0111 1111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20 同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。 不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比: 无符号数: 0 ----------------- 255 有符号数: -128 --------- 0 ---------- 127 同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128。所以二者能表达的不同的数值的个数都一样是256个。只不过前者表达的是0到255 这256个数,后者表达的是-128到+127这256个数。 一个有符号的数据类型的最小值是如何计算出来的呢? 有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位(见第3点)。但在负值范围内,数值的计算方法不能直接使用1* 26+ 1* 25的公式进行转换。在计算机中,负数除为最高位为1以外,还采用补码形式进行表达。所以在计算其值前,需要对补码进行还原。这些内容我们将在第六章中的二进制知识中统一学习。 这里,先直观地看一眼补码的形式: 以我们原有的数学经验,在10进制中:1 表示正1,而加上负号:-1 表示和1相对的负值。 那么,我们会很容易认为在2进制中(1个字节): 0000 0001 表示正1,则高位为1后:1000 0001应该表示-1。 然而,事实上计算机中的规定有些相反,请看下表:

原码、反码、补码,计算机中负数的表示

原码:将一个整数,转换成二进制,就是其原码。如单字节的5的原码为:0000 0101;-5的原码为1000 0101。 反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。 如单字节的5的反码为:0000 0101;-5的反码为1111 1010。((((((char、short、int 和long 称为有序类型(integral types)。有序类型可以有符号,也可以无符号。在有符号类型中,最左边的位是符号位,余下的位代表数值。在无符号类型中,所有的位都表示数值。如果符号位被置为1,数值被解释成负数;如果是0,则为正数。一个8 位有符号的char 可以代表从-128 到127 的数值;一个无符号的char 则表示0 到255 范围 内的数值。))))) 补码:正数的补码就是其原码;负数的反码+1就是补码。如单字节的5的补码为:0000 0101;-5的原码为1111 1011。 在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。负数用补码表示,如单字节-5,在计算机中表示为1111 1011。 这儿就有一个问题,为什么在计算机中,负数用补码表示呢?为什么不直接用原码表示?如单字节-5:1000 0101。 我想从软件上考虑,原因有两个: 1、表示范围 拿单字节整数来说,无符号型,其表示范围是[0,255],总共表示了256个数据。有符号型,其表示范围是[-128,127]。 先看无符号,0表示为0000 0000,255表示为1111 1111,刚好满足了要求,可以表示256个数据。 再看有符号的,若是用原码表示,0表示为0000 000。因为咱们有符号,所以应该也有个负0(虽然它还是0):1000 0000。 那我们看看这样还能够满足我们的要求,表示256个数据么? 正数,没问题,127是0111 1111,1是0000 0001,当然其它的应该也没有问题。 负数呢,-1是1000 0001,那么把负号去掉,最大的数是111 1111,也就是127,所以负数中最小能表示的数据是-127。

有符号数与无符号数的探讨

有符号数与无符号数的探讨 这个问题,要是简单的理解,是很容易的,不过要是考虑的深了,还真有些东西呢。 下面我就把这个东西尽量的扩展一点,深入一点和大家说说。 一、只有一个标准! 在汇编语言层面,声明变量的时候,没有si g ned和u nsi gn d e之分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!汇编器不会区分有符号还是无符号然后用两个标准来处理,它统统当作有符号的!并且统统汇编成补码!也就是说,d b-20汇编后为:EC,而d b236汇编后也为EC。这里有一个小问题,思考深入的朋友会发现,db是分配一个字节,那么一个字节能表示的有符号整数范围是:-128~+ 127,那么d b236超过了这一范围,怎么可以?是的,+236的补码的确超出了一个字节的表示范围,那么拿两个字节(当然更多的字节更好了)是可以装下的,应为:00EC,也就是说+236的补码应该是00EC,一个字节装不下,但是,别忘了“截断”这个概念,就是说最后汇编的结果被截断了,00EC是两个字节,被截断成EC,所以,这是个“美丽的错误”,为什么这么说?因为,当你把236当作无符号数时,它汇编后的结果正好也是EC,这下皆大欢喜了,虽然汇编器只用一个标准来处理,但是借用了“截断”这个美丽的错误后,得到的结果是符合两个标准的!也就是说,给你一个字节,你想输入有符号的数,比如-20那么汇编后的结果是符合有符号数的;如果你输入236那么你肯定当作无符号数来处理了(因为236不在一个字节能表示的有符号数的范围内啊),得到的结果是符合无符号数的。于是给大家一个错觉:汇编器有两套标准,会区分有符号和无符号,然后分别汇编。其实,你们被骗了。:-) 二、存在两套指令! 第一点说明汇编器只用一个方法把整数字面量汇编成真正的机器数。但并不是说计算机不区分有符号数和无符号数,相反,计算机对有符号和无符号数区分的十分清晰,因为计算机进行某些同样功能的处理时有两套指令作为后备,这就是分别为有符号和无符号数准备的。但是,这里要强调一点,一个数到底是有符号数还是无符号数,计算机并不知道,这是由你来决定的,当你认为你要处理的数是有符号的,那么你就用那一套处理有符号数的指令,当你认为你要处理的数是无符号的,那就用处理无符号数的那一套指令。加减法只有一套指令,因为这一套指令同时适用于有符号和无符号。下面这些指令:m ul di v m ovz x…是处理无符号数的,而这些:i m ul i di v

正数与负数的原码

正数与负数的原码,反码,补码 正数的原码,补码,反码都相同,都等于它本身 2.负数的原码符号位为1,其余不变负数的补码是:符号位为1,其余各位求反,末位加1 反码是:符号位为1,其余各位求反,但末位不加1 也就是说,反码末位加上1就是补码-1011 原码:11011 反码:10100 //负数时,反码为原码取反补码:10101 //负数时,补码为原码取反+1 原码表示法 原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:1表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作〔x〕原。例如,X1= +1010110 X2= 一1001010 其原码记作: 〔X1〕原=[+1010110]原=01010110 〔X2〕原=[-1001010]原=11001010 补码表示法 机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作〔X〕补。 例如,[X1]=+1010110 [X2]= 一1001010 [X1]原=01010110 [X1]补=01010110 即[X1]原=[X1]补=01010110 [X2] 原= 11001010 [X2] 补=10110101+1=10110110 反码表示法 机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作〔X〕反。 例如:X1= +1010110 X2= 一1001010 〔X1〕原=01010110 [X1]反=〔X1〕原=01010110 [X2]原=11001010 [X2]反=10110101

计算机组成原理_计算机的运算方法_61 无符号数和有符号数_

6.1 无符号数和有符号数

寄存器的位数 反映无符号数的表示范围 8 位 0 ~ 255 16 位 0 ~ 65535

带符号的数 符号数字化的数 + 0.10110 1011小数点的位置+ 11000 1100 小数点的位置– 1100 1 1100 小数点的位置 – 0.10111 1011 小数点的位置真值 机器数 1. 机器数与真值

2. 原码表示法—整数 带符号的绝对值表示 x 为真值n 为整数的位数 如x = +1110 [x ]原 = 0 , 1110 [x ]原 = 24 + 1110 = 1 , 1110 x = 1110[x ]原 = 0,x 2n > x ≥ 0 2n x 0 ≥ x > 2 n 用 逗号 将符号位和数值部分隔开

x 为真值 如x = + 0.1101 [x ]原 = 0 . 1101 x = – 0.1101[x ]原 = 1 – (–0.1101) = 1 . 1101 x 1 > x ≥ 0 [x ]原 = 1 – x 0 ≥ x >–1 x = – 0.1000000 [x ]原 = 1 – (– 0.1000000) = 1 . 1000000 x = + 0.1000000[x ]原 = 0 . 1000000 用 小数点 将符号位和数值部分隔开 用 小数点 将符号位和数值部分隔开 2. 原码表示法—小数

例 6.1 已知 [x ]原 = 1.0011 求 x 解:例 6.2 已知 [x ]原 = 1,1100 求 x 解:x = 1 – [x ]原 = 1 – 1.0011 = –0.0011 x = 24 – [x ]原 = 10000 – 1,1100 = –1100 – –0.0011 1100由定义得 由定义得

原码补码和反码的具体定义

原码补码和反码的具体定义 数在计算机中是以二进制形式表示的。 数分为有符号数和无符号数。 原码、反码、补码都是有符号定点数的表示方法。 一个有符号定点数的最高位为符号位,0是正,1是副。以下都以8位整数为例, 原码就是这个数本身的二进制形式。 例如 0000001 就是+1 1000001 就是-1 正数的反码和补码都是和原码相同。 负数的反码是将其原码除符号位之外的各位求反 [-3]反=[10000011]反=11111100 负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。 [-3]补=[10000011]补=11111101 一个数和它的补码是可逆的。

为什么要设立补码呢? 第一是为了能让计算机执行减法: [a-b]补=a补+(-b)补 第二个原因是为了统一正0和负0 正零:00000000 负零:10000000 这两个数其实都是0,但他们的原码却有不同的表示。 但是他们的补码是一样的,都是00000000 特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!) [10000000]补 =[10000000]反+1 =11111111+1 =(1)00000000 =00000000(最高位溢出了,符号位变成了0) 有人会问 10000000这个补码表示的哪个数的补码呢? 其实这是一个规定,这个数表示的是-128

所以n位补码能表示的范围是 -2^(n-1)到2^(n-1)-1 比n位原码能表示的数多一个 又例: 1011 原码:01011 反码:01011 //正数时,反码=原码 补码:01011 //正数时,补码=原码 -1011 原码:11011 反码:10100 //负数时,反码为原码取反 补码:10101 //负数时,补码为原码取反+1 0.1101 原码:0.1101 反码:0.1101 //正数时,反码=原码 补码:0.1101 //正数时,补码=原码 -0.1101 原码:1.1101

原码反码补码及运算

原码,反码,补码及运算 一、定义 1.原码 正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。用这样的表示方法得到的就是数的原码。 【例2.13】当机器字长为8位二进制数时: X=+1011011 [X]原码=01011011 Y=+1011011 [Y]原码=11011011 [+1]原码=00000001 [-1]原码=10000001 [+127]原码=01111111 [-127]原码=11111111 原码表示的整数范围是: -(2n-1-1)~+(2n-1-1),其中n为机器字长。 则:8位二进制原码表示的整数范围是-127~+127 16位二进制原码表示的整数范围是-32767~+32767 2.反码 对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。 【例2.14】当机器字长为8位二进制数时: X=+1011011 [X]原码=01011011 [X]反码=01011011 Y=-1011011 [Y]原码=11011011 [Y]反码=10100100 [+1]反码=00000001 [-1]反码=11111110 [+127]反码=01111111 [-127]反码=10000000 负数的反码与负数的原码有很大的区别,反码通常用作求补码过程中的中间形式。反码表示的整数范围与原码相同。 3.补码 正数的补码与其原码相同,负数的补码为其反码在最低位加1。 引入补码以后,计算机中的加减运算都可以统一化为补码的加法运算,其符号位也参与运算。 【例2.15】(1)X=+1011011 (2)Y=-1011011 (1)根据定义有:[X]原码=01011011 [X]补码=01011011 (2)根据定义有:[Y]原码=11011011 [Y]反码=10100100 [Y]补码=10100101 补码表示的整数范围是-2n-1~+(2n-1-1),其中n为机器字长。 则:8位二进制补码表示的整数范围是-128~+127(-128 表示为10000000,无对应的原码和反码)16位二进制补码表示的整数范围是-32768~+32767 当运算结果超出这个范围时,就不能正确表示数了,此时称为溢出。 所以补码的设计目的是: ⑴使符号位能与有效值部分一起参加运算,从而简化运算规则. ⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计 4.补码与真值之间的转换 正数补码的真值等于补码的本身;负数补码转换为其真值时,将负数补码按位求反,末位加1,即可

相关文档
最新文档