大二上,计组原理笔记(1)2.1数值数据的表示 原码,补码

前言: 我的个人听课记录,毕竟是初学,错误在所难免,我知道了错误会改正更新,欢迎指导也欢迎一起讨论学习。

第二章:数据的表示

2.1 数值数据的表示
2.2 机器数的定浮点表示
2.3 非数值数据的表示
2.4 十进制数和数串的表示
2.5 不同数据的数据表示举例
2.6 数据校验码

2.1数值数据的表示

2.1.1无符号数的表示

计算机中无符号数的核心就是进制转换。尤其是十进制和二进制的相互转化。

N1 =1001  表示无符号数9
N2 =0001  表示无符号数1

2.1.2带符号数(有符号数,即正、负数)

带符号数可以用原码、反码、补码、变形补码、移码表示。(都是二进制表示形式,一组01串)(移码在下一节阶码中)
核心:+:0;-:1
原码:计算机无法识别正负号,于是约定编码的首位为符号位。正号(+)用0表示,负号(-)用1表示。正负号之后的数值用进制转换转为二进制数(无符号数方法)
正数的原码、反码、补码一样。
反码(负数):在原码的基础上,符号位不变,数值位按位取反。作用:反码的引入是为了引出补码。
补码(负数):在反码的基础上,加一(符号位参与运算)。作用:将减法转化为加法。
变形补码:在补码的基础上,符号位扩展,重复一次。作用:判断运算时是否溢出。

例:写出“-9”在计算机中的表示形式

解:符号位:-,用1表示;数值的二进制表示为:1001
原码:11001
反码:10110
补码:(10110+1=10111
变形补码:110111

那你能写出“+9”在计算机的表示形式吗?

解:符号位:+,用0表示;数值的二进制表示为:1001
原码:01001
反码:01001
补码:01001
变形补码:001001

那来看看这个代码的输出结果是什么(计算机中用补码表示):

#include
using namespace std;
int main()
{
short int n=-1;
cout<<(unsigned short int)n<<endl;//将短整型强制类型转换为无符号短整型
}

输出结果是:65535
你做对了吗?
原理:
short int 为短整型,为2字节,所以有16位
求-1在计算机中具体存储为:
-1的16位二进制表示
原码为:1 0000 0000 0000 001
反码:1 1111 1111 1111 110
补码:1 1111 1111 1111 111
所以计算机中-1的具体存储为补码:
1 1111 1111 1111 111
这个补码表示的无符号数为:216-1=65535。

原码和补码表示的范围(4位二进制数):

原码:首位为符号位,后三位为数值。

最小值就是符号为负时,数值最大的。即1111。即-7
最大值就是符号为正时,数值最大的。即0111。即+7
然而:4位二进制数有16个编码,原码从-7+7只表示了15个数,为什么呢?
因为0在原码中占了+0-0两种编码。
+0为:0000-0为:1000

补码

有一个很特殊很特殊的编码:1000。
原码1000-0)的补码是0000,而原码0000的补码也是0000~1~0000),所以在补码中+0-0的编码只有一种:0000。于是在原码中将1000看为-8。
于是1000(-8)是补码表示的最小值,补码表示的最大值仍然是0111+7)。

总结(4位)

原码:(1111,0111)即(-7+7)
补码:(1000,0111)即(-8+7

几个题(默认计算机中用补码)

例1:计算机中如何对3-2进行运算。

3-2即(+3+-23+3的补码为:0011(原、反、补码都是)
-2的补码为:11101010反码为1101,再加1,补码为:1110)
将这俩补码送到加法器中进行运算:0011+1110=0001~1~0001)。
0001在计算机中为补码形式,转换为原码仍然是0001+1),因为它是正数。
则结果的补码0001代表的数为+1。即3-2=1

例2:计算机中对-2-1进行运算的过程

-2-1即(-2+-1-2的补码为:11101010反码1101,再加1,补码是1110-1的补码为:11111001反码1110,再加1,补码是11101)
将这俩补码送到加法器中进行运算:1110+1111=1101~1~11011101的原码是对其再求一次补码:1010+1=1011
1011-3

例3:变形补码的意义
-6-4

-6的补码:1010
-4的补码:1100
1010+1100=0110~1~0110)
而0110的原码为0110,即+6。由结果可知出问题了,为啥呢?
我们知道-6-4=-10,而四位二进制最小可表示的:原码为-7,补码为-8-10超出了可表示的范围,于是这个属于溢出问题。
这就是引入变形补码的意义:
-6的变形补码:11010
-4的变形补码:11100
11010+11100=10110~~1~~ 10110)
而前两位为10,不一致,说明运算出现了溢出问题。

4位二进制扩展为8位(原,补码)

原码:

整数:符号位和数值位之间加0
例:-4的原码为1100,其中首位1为符号位,110为数值位,所以可以在符号位和数值位之间加0,即1 0000 100。(-00···04=-4的原理)
例:4的原码是0100,扩展为:0 0000 100
纯小数:最后补0
-0.5的原码为1.100,在最后补0,扩展应该是:1.100 0000,(-0.5=0.500···的原理)

补码:

整数:符号位扩展。
例:1000(记住是-8)的扩展应该是1 1111 000(-8的8位补码)
求1 1111 000表示的原码(再求补码):1 0000 111+1=10001000即-8。
例:当0101(+5)的扩展应该是:0 0000 101(+5的8位补码,也是原码和反码)所以也可以将正数的原码,反码扩展统一为一种。
纯小数:最后补0
-0.5的补码为1.011+1=1.100,
扩展为8位应该是:1.100 0000 (-0.5的8位补码)
求1.100 0000 表示的原码:
1.011 1111+1=1.100 0000即-0.5说明正确。

总结一下:

小数:
原码、补码都是最后补0
整数:
原码和正的补码:符号位和数值位之间加0
负的补码:符号位和数值位之间加1

例:将符号数:0100、1010扩展为8位表示

10100为正数。
若表示整数:+4,
原码或补码扩展都为:0 0000 100
若表示小数:+0.5,
原码或补码扩展都为:0100 000021010为负数。
若为整数:
原码(-2)扩展为:1 0000 010
补码(-6)扩展为:1 1111 010
若为小数:
原码(-0.25)或补码(-0.75)扩展都为:1 010 0000

几个题

例1: [ X ] 补 [X]_补 [X]=1001
[ − X ] 补 [-X]_补 [X]=?

(1)
[ X ] 原 [X]_原 [X]= [ [ X ] 补 ] 补 [[X]补]_补 [[X]]=1110+1=1111,
[ − X ] 原 [-X]_原 [X]=0111,
[ − X ] 补 [-X]_补 [X]=0111(正数)。

例2: [ X ] 补 [X]_补 [X]=1101
[ 2 X ] 补 [2X]_补 [2X] [ 4 X ] 补 [4X]_补 [4X] [ X / 2 ] 补 [X/2]_补 [X/2]分别=?

a.
[ X ] 原 [X]_原 [X]= [ X ] 补 [X]_补 [X]补=1010+1=1011即-3.

基础法:
[ 2 X ] 原 [2X]_原 [2X]= [ − 6 ] 原 [-6]_原 [6]=1110,
所以 [ 2 X ] 补 [2X]_补 [2X]=1001+1=1010

进阶法:
先看原理:十进制:11 × \times × 10=110,可以看成小数点右移1位。
同理二进制:1 × \times × 10=10(1 × \times × 2=2),看成是小数点向右移动一位或者是数往左移一位,空位补0.

具体:
× \times × 2n
原码、补码:小数点向右移n位,空的填0

÷ \div ÷ 2 n,
原码及正数的补码:小数点往左移动位n位,但是,不能越过符号位,空出来的补0
负数的补码:符号位不动,小数点向左移n位,绝对不能越符号位,中间空出来的补1

所以:
已知 [ X ] 补 [X]_补 [X]=1101,求 [ 2 X ] 补 [2X]_补 [2X] 核心是 × \times × 21
过程:

    1101.1101_.  11010.~1~1010.1010(结果)

b.
[ 4 X ] 补 [4X]_补 [4X]
向右移两位:11 0100,为正数,负数 × \times × 4不可能为正数。
原因: 4X=-12,
超出了四位能表示的范围,溢出错误。
c.
已知 [ X ] 补 [X]_补 [X]=1101,求 [ X / 2 ] 补 [X/2]_补 [X/2]核心是 ÷ \div ÷ 21
过程

       1 1 0 1.1 _ 1 0.11 1 1 0.1(负数的补码,填符号位)1 1 1 0~1~1 1 1 0(结果)

因为舍弃了后面的,所以带来了误差
例3:写出- 3 16 {3}\over{16} 163的原码、补码、变形补码。

- 3 16 {3}\over{16} 163 = -3 × \times × 2-4 = -3 ÷ \div ÷ 24

可知-3的原码:111
过程

       1 1 1.1._ _ 1 1(小数点移四位)1.0 0 1 1(补0)结果:10011

可知-3的补码:100+1=101
过程:

   1 0 1.1._ _ 0 1(负的补码)1.1 1 0 1
结果:11101  

检验:
10011的补码:11100+1=11101可知,没问题。
变形补码:111101

课后作业

设计一个输入原码,输出原码的编译器。可以用逻辑门电路,Verilog语言,也可以用C++编程序。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部