第3讲 位操作与补码知识 补充
- 格式:doc
- 大小:529.00 KB
- 文档页数:3
补码原理补码所有的计算机资料都规定:补码是将各位按位取反,再加1.学的时候并没有觉得有什么疑问,但是写代码很多年之后,回过头去温习计算机原理,突然冒出来⼏个问题为什么要有补码这个东西?为什么补码要按位取反?为什么要有左移右移?这些都是为了计算机实现加减乘除才出现的。
⾸先讲讲加减,计算机没有减法,所以就是加上负数来替代它。
举个例⼦吧2的⼆进制是0000 0010,那么-2的表⽰是否是1000 0010呢验证⼀下,假如它们成⽴就必须2+(-2)=0两者的相加为1000 0100,不管前⾯符号位是0还是1,这个数都不等于0.那么我们反过来想,我想要获取⼀个数的负数是多少,那么只要确保这个数加上它的负数等于0还是刚刚的例⼦2的⼆进制是0000 0010,那么0的⼆进制是0000 0000我们知道⼆进制加法中,正常情况下2加上任何数都不能等于0,只有⼀种情况,那就是⾼位溢出。
⽐如2加上某个数变成了1 00000000,这个时候计算机会弃掉⾼位的1.这就很简单了,我把2按位取反,变成1111 1101,它加上2就是1111 1111,这个时候我只需要再加1,就能变成1 00000000.所以将2按位取反再加1为11111110,这就是补码。
补码的规则就有了,将各位按位取反,再加1. 补码就是⽤正数表⽰的负数形式。
因为符号位的特殊,0000 0000 - 1111 1111 ⼀共能表⽰256个,所以1个字节表⽰的⽆符号范围是0 到28 -1(⼀共256个),有符号- 27到 27-1(⼀共256个)好,问题来了,⽆符号的范围不⽤说,有符号的范围为什么负数是-128,正数只能到127呢我们可以看到,有符号位的⼆进制数第⼀位是符号,所以剩下的7位表⽰数正数范围从0到127没有问题。
1到127对应的数都有其补码,对应了-127到-1唯独剩下个0,0归为正数,它的⼆进制是0000 0000,那么现在就剩下⼀个1000 0000没有表⽰,因为符号位的原因,它相当于是-0.但是-0也是0,所以规定1000 0000表⽰负数最⼤值,也就是128所以0的补码就是-128,所以有符号位的范围是-128到127左移和右移补码的出现是为了表⽰负数,来做加法和减法。
计算机原理- 整数的补码,原码, 反码解释一:对于整数来讲其二进制表示没有符号位.一个字节的表示范围为00000000-11111111,由此可见一个字节的整数表示范围为[0,255=2^8 - 1]。
对于整数来讲,其二进制表示中存在一个符号位.先来看一下下面几个定义:1:在计算机中,负数以其正值的补码形式表达。
正数即在符号位补0.2:原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
3:反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
4:补码: 反码+1由以上可以得到.计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0;正数的原码、补码可以特殊理解为相同;负数的补码是它的反码加1。
范围: 正数[00000000 - 01111111] 即[0, 2^7 - 1]。
负数[10000000 - 11111111] 。
范围说明. 11111111 - 1 = 11111110,取反=00000001 即是-1. 10000000 -1 = 01111111,取反=10000000, 即是-128. 因此有一个有符号二进制表示范围是从[-128-127].解释二:大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即2^8(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~2^8 -1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。
别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。
原码,反码与补码基础知识详细介绍原码, 反码,补码详解本篇⽂章讲解了计算机的原码, 反码和补码. 并且进⾏了深⼊探求了为何要使⽤反码和补码, 以及更进⼀步的论证了为何可以⽤反码, 补码的加法计算原码的减法. 论证部分如有不对的地⽅请各位⽜⼈帮忙指正! 希望本⽂对⼤家学习计算机基础有所帮助!⼀. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.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=01 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2如果⽤原码表⽰, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使⽤原码表⽰⼀个数.为了解决原码做减法的问题, 出现了反码:计算⼗进制的表达式: 1-1=01 - 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] 因为第⼀位表⽰的是符号位.⽽使⽤补码表⽰时⼜可以多保存⼀个最⼩值.四原码, 反码, 补码再深⼊计算机巧妙地把符号位参与运算, 并且将减法变成了加法, 背后蕴含了怎样的数学原理呢?将钟表想象成是⼀个1位的12进制数. 如果当前时间是6点, 我希望将时间设置成4点, 需要怎么做呢?我们可以:1. 往回拨2个⼩时: 6 - 2 = 42. 往前拨10个⼩时: (6 + 10) mod 12 = 43. 往前拨10+12=22个⼩时: (6+22) mod 12 =42,3⽅法中的mod是指取模操作, 16 mod 12 =4 即⽤16除以12后的余数是4.所以钟表往回拨(减法)的结果可以⽤往前拨(加法)替代!现在的焦点就落在了如何⽤⼀个正数, 来替代⼀个负数. 上⾯的例⼦我们能感觉出来⼀些端倪, 发现⼀些规律. 但是数学是严谨的. 不能靠感觉.⾸先介绍⼀个数学中相关的概念: 同余同余的概念两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余记作 a ≡ b (mod m)读作 a 与 b 关于模 m 同余。
1.第一篇数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚."(摘自<<数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题.数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为(-127~-0 +0~127)共256个.? 有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits( 1 )?10-? ( 1 )10?=? ( 1 )10?+ ( -1 )10?= ?( 0 )10(00000001)原?+ (10000001)原?= (10000010)原?= ( -2 )?显然不正确.? 因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:?( 1 )10?-? ( 1 )?10=? ( 1 )?10+ ( -1 )?10= ?( 0 )10?(00000001)?反+ (11111110)反?=? (11111111)反?=? ( -0 ) ?有问题.( 1 )10?-? ( 2)10?=? ( 1 )10?+ ( -2 )10?= ?( -1 )10(00000001)?反+ (11111101)反?=? (11111110)反?=? ( -1 )?正确问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个.注意:(-128)没有相对应的原码和反码, (-128) = (10000000) ?补码的加减运算如下:( 1 )?10-? ( 1 )?10=? ( 1 )10?+ ( -1 )10?= ?( 0 )10(00000001)补?+ (11111111)补?=? (00000000)补?= ( 0 )?正确( 1 )?10-? ( 2)?10=? ( 1 )10?+ ( -2 )10?= ?( -1 )10(00000001)?补+ (11111110)?补=? (11111111)补?= ( -1 ) ?正确?? 所以补码的设计目的是:???? ⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计? 所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。
⼆进制、原码、补码和位运算的⼊门⼀、⼗进制· 每个位置可以有10个数字,从0到9· 每个位置都有⼀个位权,从右到左,第⼀位为1,然后依次乘以10,即第⼆位为10,第三位为100,依次类推,如:123表⽰的1*(10^2) + 2*(10^1) + 3*(10^0),(10^2表⽰10的⼆次⽅),它表⽰的是各个位置数字含义之和。
每个位置的数字含义与位置有关,从右向左,第⼀位乘以10的0次⽅,即1,第⼆位乘以10的1次⽅,即10,第三位乘以10的2次⽅,即100,依次类推。
⼆、⼆进制1. 正整数的⼆进制表⽰每个位置只能是0或1。
位权的概念是类似的,从右到左,第⼀位为1,然后依次乘以2,即第⼆位为2,第三位为4,依次类推。
使⽤符合我们直觉的原码表⽰法看⼀些数字的例⼦吧:⼆进制⼗进制10211311171010102. 负整数的⼆进制表⽰1. ⼗进制的负数表⽰就是在前⾯加⼀个负数符号-,例如-1232. ⼆进制使⽤最⾼位表⽰符号位,⽤1表⽰负数,⽤0表⽰正数。
3. 使⽤补码表⽰法,补码表⽰就是在原码表⽰的基础上取反然后加1。
取反就是将0变为1,1变为0。
⽐如:-1:1的原码表⽰是00000001,取反是11111110,然后再加1,就是11111111。
-2:2的原码表⽰是00000010,取反是11111101,然后再加1,就是11111110-127:127的原码表⽰是01111111,取反是10000000,然后再加1,就是10000001。
4. 给定⼀个负数⼆进制表⽰,要想知道它的⼗进制值,可以采⽤相同的补码运算。
⽐如:10010010,⾸先取反,变为01101101,然后加1,结果为01101110,它的⼗进制值为110,所以原值就是-110。
3. 负整数为什么采⽤补码呢?· 因为只有这种形式,计算机才能实现正确的加减法。
· 计算机其实只能做加法⽐如:1-1其实是1+(-1)。
计算机运算——位与补码对于多数编译器而言(包括VC++),char 都视作 signed char来处理,这时 char 的取值范围得与二进制编码技术有关,对于补码表示法。
char 的取值范围是 -128 - 127,对于符号绝对值编码法、反码记法, char 的取值范围是 -127 - 127。
char 有 8 位,最高位是符号位,所以 char可以在 -127 - 127 取值是没有疑问了。
当最高位是 1,其余位都是 0 时,按照补码表示法的规则,这个数应该是负数了,用求负数的二进制的方法反推回去:二进制: 1000 0000减一: 0111 1111逐位取反: 1000 0000 //和原来的二进制形式一样,对应正整数 128经过这一系列操作之后,二进制形式依然是1000 0000,对应数值128,但这个数是负数,因为反推前最高位是 1 的,故对应 -128。
其他的整数类型 short 、int、long 也可以这样推导。
我们的机器多数是基于补码表示的11111111 = -110000000 = -128现在证明 10000000 表示的是 -128而不是-010000000 + 00000001 = 10000001 = -127显然 -128 + 1 = -12711111111 符号位为1表示负数将数值位按位取反加一得到0000000+1 = 0000001所以 11111111 = -11、在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。
另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
求给定数值的补码表示分以下两种情况:(1)正数的补码与原码相同。
【例1】+9的补码是00001001。
(2)负数的补码符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
中职计算机原理(高教版)教案:原码、反码和补码一、教学目标1. 让学生了解计算机中的数值表示方法,包括原码、反码和补码。
2. 使学生掌握原码、反码和补码的转换方法及规律。
3. 培养学生运用原码、反码和补码进行计算机数值运算的能力。
二、教学内容1. 原码的概念及表示方法2. 反码的概念及表示方法3. 补码的概念及表示方法4. 原码、反码和补码的转换规律5. 原码、反码和补码在计算机中的运用三、教学重点与难点1. 重点:原码、反码和补码的概念、表示方法及转换规律。
2. 难点:原码、反码和补码的转换方法,以及在计算机中的运用。
四、教学方法1. 采用讲授法,讲解原码、反码和补码的概念、表示方法及转换规律。
2. 运用案例分析法,分析原码、反码和补码在计算机中的运用。
3. 开展小组讨论法,让学生互相交流、探讨原码、反码和补码的转换方法。
五、教学过程1. 引入:讲解计算机中的数值表示方法,引出原码、反码和补码的概念。
2. 讲解:详细讲解原码、反码和补码的表示方法及转换规律。
3. 案例分析:分析原码、反码和补码在计算机中的运用,如加减运算、比较运算等。
4. 小组讨论:让学生分组讨论原码、反码和补码的转换方法,分享心得。
5. 总结:总结原码、反码和补码的概念、表示方法及转换规律,强调其在计算机中的重要性。
6. 课后作业:布置相关练习题,巩固所学知识。
教案编写仅供参考,具体实施可根据实际情况进行调整。
六、教学评估1. 课堂提问:通过提问了解学生对原码、反码和补码的理解程度。
2. 练习题:布置课后练习题,检查学生掌握原码、反码和补码转换方法的熟练程度。
3. 小组讨论:观察学生在小组讨论中的表现,了解他们的合作能力和解决问题的能力。
七、教学拓展1. 讲解其他数值表示方法:如移码、浮点数等。
2. 介绍原码、反码和补码在计算机硬件中的应用。
3. 探讨原码、反码和补码在计算机网络中的应用。
八、教学资源1. 教材:《中职计算机原理》高教版。
任意一个二进制数真值在计算机中用机器数来表示,最基本的机器数有三种,即原码、补码和反码。
[1]在计算机的运算过程中,根据不同的运算运用不同的机器数,可以简化计算机运算过程并很快得到运算结果。
如乘法和除法用原码参与运算比较方便,符号位通过异或运算即得结果的符号位;而加法与减法运算用补码参与运算比较方便,它使符号位不用单独处理,可以一起参与运算。
在计算机中,三种机器数能方便、容易地进行转换,这给使用带来极大方便。
其转换要点有三:(1)将一个数的二进制真值的最高位置上符号位(正数用0,负数用1表示),就是这个数的原码。
(2)对于一个正数,其原码、补码、反码在计算机中的表示代码相同,其代码不用改变。
(3)对于一个负数,将原码的符号位(即二进制数的最高位,也即原码最左边的那一位)保持不变,数值位逐位取反(变为反码),末位(即最右边的那一位)加1,即得补码。
也就是说,一个负数的补码等于该负数的反码与末位加1之和。
一、对于定点负整数(一)、补码的定义[2]如下:[X]补=2n+XMOD(2n)(1)从定义知,一个n位二进制定点负整数,求其补码时,用2n为模数加上该负数即可。
例如:已知n=8,X=-1010101,则[X]补=2n+X=28+(-1010101)=100000000-1010101=10101011(说明:28的二进制为100000000,简记:28的二进制为1个1后有8个0)(二)、反码的定义[2]如下:[X]反=(2n-1)+X[MOD(2n-1)] (2)从定义知,一个n位定点负整数,求其反码时,用2n-1为模数加上该负数即可。
例如:已知n=8,X=-1010101,则[X]反=(2n-1)+X=(28-1)+(-1010101)=11111111-1010101=10101010。
有了以上定点负整数补码,反码的定义,我们就很容易地证明,对于任一定点负整数,其补码等于其反码末位加1。
由(2)式,[X]反=(2n-1)+X,得:X=[X]反-2n+1将其代入(1)式,有[X]补=2n+X=2n+[X]反-2n+1=[X]反+1(A)根据以上推导,命题对于定点负整数是成立的。
微机原理重要知识点总结一、数据的表示和运算1. 二进制数系统二进制是计算机中常用的数制,它由0和1这两个数字组成。
在计算机中,所有的数据都是以二进制的形式存储和处理的。
因此,理解二进制数系统对于理解计算机的工作原理至关重要。
2. 补码表示在计算机中,负数通常是以补码的形式表示的。
补码是一种用来表示负数的二进制编码方式,它的特点是减法和加法可以同样适用,这样可以简化计算。
3. 位运算位运算是一种对二进制数据进行操作的方式,包括与、或、非、异或等操作。
位运算可以用于快速实现一些数值的计算,提高程序的执行效率。
4. 浮点数表示在计算机中,浮点数是一种用科学计数法表示的实数。
它由符号位、指数位和尾数位组成,具有一定的精度和范围。
理解浮点数表示对于理解计算机中的实数运算和精度问题是很重要的。
二、数字逻辑电路1. 基本逻辑门基本逻辑门包括与门、或门、非门等,它们是数字逻辑电路的基本构成单元。
其他的逻辑电路都可以由这些基本的逻辑门组合而成。
2. 组合逻辑电路组合逻辑电路是一种由多个逻辑门组合而成的电路,它的输出仅依赖于输入信号的当前值。
常见的组合逻辑电路包括加法器、比较器、多路选择器等。
3. 时序逻辑电路时序逻辑电路是一种在特定的时钟信号下工作的逻辑电路,它的输出还依赖于输入信号的变化过程。
常见的时序逻辑电路包括触发器、计数器、移位寄存器等。
4. 存储器存储器是一种用来存储数据的电路,它可以分为寄存器、RAM、ROM等不同类型。
存储器在计算机系统中起着非常重要的作用,它决定了计算机的存储容量和存取速度。
三、计算机系统结构1. 冯·诺伊曼体系结构冯·诺伊曼体系结构是一种通用的计算机系统结构,它包括运算器、控制器、存储器和输入输出设备等部分。
理解冯·诺伊曼体系结构对于理解计算机的工作原理和设计原理是非常重要的。
2. 指令和指令格式指令是计算机执行的基本操作,它由操作码和操作数等部分组成。
补码运算的法则补码运算的法则要在“微机原理”这门课中讲到,在“数字电子技术”课中不作重点,只需一般了解即可。
在数字电子技术教科书中,补码部分是用4位或5位2进制数来讲的,所以本文中也多以4、5位二进制数做例子。
利用补码运算必须确定运算数的位数,这样才能确定补码的模数。
在计算机中,带符号的数的表示方法有3种:原码、补码和移码。
本文不讨论移码。
一、计算机中数的表示法1. 原码对一个二进制数而言,若用最高位表示数的符号(常以“0”表示正数,“1”表示负数),其余各位表示数的本身,则称为二进制数的原码表示法。
例如:设 A = + 1001 , B = - 0101,则[A]原= 0 1001,[B]原= 1 0101。
[A]原、[B]原分别是A、B的原码,是符号数值化了的数。
符号数值化之前的带符号的数A、B称为是“真值”。
2. 补码(1)补码的定义:根据同余的概念X + NK = X ( mod K ) ………………①括号中的部分不参加运算,它表示“K是模”。
N是任意整数。
该式的含义是,数X与该数加上其模的任意整倍数之和相等。
例如钟表的表盘,模为12,不论指针转了几圈,3点总是3点。
用定义式表示,即3 + N×12 = 3在①式中,当N=1时有[X]补数= X + K,[X]补数称为是X的补数。
当0 ≤X <K时,[X]补数= X当- K ≤X <0 时,[X]补数= X + K例如表盘模= 12当X = 3 时,[3]补数= 3 ,其涵义是表针正着转了3 格;当X = -3 时,[-3]补数= -3+12 = 9 ,其含义就是指针倒着转了3格,就等于正着转了9 格。
(因为X<0 ∴X+K )模= “在限定的位数中可表示的最大数”加1 。
在计算机中,一个机器数的字长为n位,它能够表示的最大数为n个“1”,其模为2n。
例如4位的机器数中,n = 4,可表示的最大数为1111B(1111B表示是一个二进制数),其模就是1111B + 1 = 1 0000 = 2 5。
关于补码以及基本的补码运算0.最基本的,补码怎么得到,这里不讨论。
以及原码和补码的和是0,这个基础的结论,这里不做说明。
1.加法的时候,判断溢出的方法:当两个加数的符号位相同,且结果的符号位与加数符号位不同的时候,则产生了溢出。
显然,两个数,如果异号,显然不会溢出。
溢出,只会出现在同号的情况,则有上面的结论。
2.补码也是有权码。
假如总共有n个比特,除最高位(符号位)以外,每一位的权值为2^i。
而最高位的权值是-2^(n-1)!注意是负的!这一点很好理解:原码和补码的和是2^n,由于总共的位数只有n位,因此和的结果是0,因此补码的最高位权值就是负的。
3.有符号数的乘法(补码的乘法),例子-5*-3:10111101-----------0000011011-----------11101100000-----------111101111011------------1110011100101-------------00001111有符号数的乘法与无符号数的乘法的区别在于:a.在做每一位的乘法的时候,都要做一个位扩展,即扩展符号位。
如上的例子,第一步做1011*1的结果是11011,扩展了一位符号位1。
道理很简单,因为这一步的结果要和下一步做一个加法,而下一步的加数的位宽较现在这一步位宽要宽一位,而加法发生在位宽相同的两个数之间,因此要做一个符号位的扩展。
b.最高位的乘法与其他位稍有不同。
因为最高位的权值是-2^(n-1) ,所以乘法的结果要做一个取反加一的操作。
如上例,1011*1(最高位的1),结果是11011(做符号位扩展),然后做一个取反加一的操作,得到例子中的00101。
4.有符号数的除法:先将有符号数取绝对值,做无符号数的除法,得到结果,最后根据被除数和除数的符号,确定商以及余数的符号。
2.3.2 补码乘法[1]作者:pz整理来源:网络2010年4月2日发表评论进入社区2.3.2补码乘法1.补码与真值得转换公式补码乘法因符号位参与运算,可以完成补码数的“直接”乘法,而不需要求补级。
原码、反码和补码的概念本节要求掌握原码、反码、补码的概念知识精讲数值型数据的表示按小数点的处理可分为定点数和浮点数;按符号位有原码、反码和补码三种形式的机器数。
一.计算机中数据的表示方法1、数的定点与浮点表示在计算机内部,通常用两种方法来表示带小数点的数,即所谓的定点数和浮点数。
①定点数:是小数点在数中的位置是固定不变的数,数的最高位为符号位,小数点可在符号位之后,也可在数的末尾,小数点本身不需要表示出来,它是隐含的。
缺点:只有纯小数或整数才能用定点数表示;②浮点数:小数点在数中的位置是浮动的、不固定的数。
一般浮点数既有整数部分又有小数部分,通常对于任何一个二进行制数N,总可以表示成:N=±2P×SN、P、S均为二进制数,P为N的阶码,一般为定点整数,常用补码表示,阶码指明小数点在数据中的位置,它决定浮点的表示范围S为N的尾数,一般为定点小数,常用补码或原码表示,尾数部分给出了浮点数的有效数字位数,它决定了浮点数的精度,且规格化浮点数0.5≤|S|<1;0.1B=( 1/2 )D =( 2-1)D0.11B=(1/2 + 1/4 )D =( 2-1+2-2)D0.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)D101100B= 1011B * (22)D101100B= 101.1B * (23)D101100B= 10.11B * (24)D101100B= 1.011B * (25)D101100B= 0.1011B * (26110一个浮点形式的尾数S若满足0.5≤|S|<1,且尾数的最高位数为1,无无效的0,则该浮点数称为规格化数;规格化数可以提高运算的精度。
法则 1 :⼀个数的相反数的补码等于该数的补码的补码,即 [- X ] 补码 =[[ X ] 补码 ] 补码X = + 0000101(⼗进制 +5 )-X = - 0000101(X的相反数,⼗进制 -5 )[ X ] 补码 = 00000101 (根据补码定义)[- X ] 补码 = 11111011 (根据补码定义)[[ X ] 补码 ] 补码 = [00000101] 补码 = [00000101] 反码 + 1 = 11111010 = 11111011法则 2 :两个数的补码之和等于该两数和的补码。
即 [ X ] 补码 + [ Y ] 补码 = [ X + Y] 补码X = 00000101 Y = 00000011[X ] 补码 = 00000101 [Y] 补码 = 00000011[X ] 补码 + [Y] 补码 = 00001000X + Y = 00000101 +00000011 = 00001000[X + Y] 补码 = [00001000 ] 补码 = 00001000两个数是负数或异号时的情况请同学⾃⼰验证。
法则 3 :两个数的补码之差等于该两数差的补码。
即 [ X ] 补码 - [ Y ] 补码 = [ X - Y] 补码根据数学知识, X - Y = X +(-Y)。
根据法则1和法则2有[ X ] 补码 + [- Y ] 补码 = [ X ] 补码 + [[ Y ] 补码 ] 补码 = [ X - Y] 补码由此可见,减法可⽤加法来实现。
因为乘法是加法的简便运算,除法是减法的简便运算;因此,乘、除法也可以⽤加法实现。
从⽽,计算机只要有了做加法的能⼒,凭借它的⾼速度,就可以完成四则算术运算了。
2.1 原码、反码与补码在计算机内的数(称之为“机器数”)值有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 。
拓展知识3-3 位运算一、位运算概述C 语言是为描述系统而设计的,它最早用于编写UNIX 操作系统。
因此,它具有一定的汇编语言的功能。
C 语言既具有高级语言的特点,又具有低级语言的功能,因而具有广泛的应用和极强的生命力。
位运算是C 语言的重要特色之一,通过位运算可以实现对内存中的一个字节甚至字节的一个二进制位进行操作,从而进一步增强了C 语言的运算能力。
所谓位运算就是对二进制位进行的运算。
在系统软件的编制中常用到位运算。
1. 位的有关概念计算机系统的内存储器是由众多的存储单元构成的,每个存储单元是一个字节,一个字节由八位组成,每一位有两种状态1和0。
所以,一个字节能表示28=256种状态。
一个字节的各位的编号从0到7,最左边的一位,即第7位是最高位,最右边的一位,即第0位是最低位,如图1所示。
整型数据在计算机内存中是以二进制数的补码形式存储在内存单元中。
用补码形式表示的优点是,可以变减法运算为加法运算,使得计算时步骤统一。
虽然不同类型的数据在内存中所占用的字节数是不同的,但存储时高位字节的最高位用来表示数的符号,其它各位用来表示数值是相同的。
下面以short 型数据为例,给出-32768~32767之间的数值所对应的二进制数的补码形式,以便对照。
见表1。
表1:short 型数值与补码对照表1个字节654321图12. 位运算的分类C语言的位运算可分为三类:位逻辑运算、位移运算、位赋值运算。
位逻辑运算包括:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)四种运算。
位移运算包括:左移(<<)、右移(>>)两种运算。
位赋值运算是以上位运算符(除按位取反运算符)与赋值运算符相结合而得到的,包括:位与赋值(&=)、位或赋值(|=)、位异或赋值(^=)、左移赋值(<<=)、右移赋值(>>=)五种运算。
如:a&=b 等价于a=a&b,a|=b 等价于a=a|b,a^=b 等价于a=a^b,a<<=b 等价于a=a<<b,a>>=b 等价于a=a>>b。
位操作与补码知识补充
经常出现的一个词是内存单元,即1B,我们说char型占1个内存单元(1B),而short型占2个内存单元(2B)。
1B被当成整体来看,但不要忘记有下面的等式成立:
1 B = 8 bits
1个字节有8个位,每个位有0、1两个取值,从这个角度上说,1个字节所能包含的意义似乎比预想的要大的多。
1.低位与高位
在内存里面的低字节和高字节顺序
注解图:
2.printf不会进行数据类型转换
上面代码去掉强制类型转换int 和float则输出如下:
加上强制类型转换后运行如下:
3.数据溢出
输出结果:
4.极大值极小值
补码图:
5.在内存存储方式
输出结果。