欢迎来到天天文库
浏览记录
ID:34367398
大小:288.60 KB
页数:4页
时间:2019-03-05
《计算机原码、反码、补码、机器数、真值、有符号数、无符号数等的区分与运算new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在计算机的存储器中统一采用二进制数的方式进行数据存储。而编程中则综合使用二进制、八进制、十进制与十六进制的数据表示方法,程序编译后一般生成十六进制的可烧写文件,而烧写到存储器后最终在存储单元中存放的还是二进制形式。而二进制又有真值,原码,反码,补码,机器数,有符号数,无符号数,等诸多概念之分。故下面主要就二进制数(以整数为例,后面提到的数据皆指整数)的存储与运算过程中涉及到的一些概念与规则进行梳理。讲的主要是在计算机中的,以8位单片机为例,后面以32位ARM单片机指令举例。1有符号数和无符号数。数据首先分为有符号数和无符号数。对于无符号数来说,肯定指的0与正数,无负数之说,自然也无原码、反
2、码、补码之说,一般也不针对于无符号数讨论机器数、真值等概念。其存储方式与有符号数存储也无特别之处,具体的将在“存储单元中的数据”一节讲述。有符号数,有正负与0三种,由于在计算机中无法表示负号,或者说用专门的符号表示负号很不方便,于是就采用对正负号进行数值编码的方式,用“0”代表非负数,“1”代表负数。根据不同的编码方式,对有符号数一般可以有原码、反码、补码三种最常见的编码形式。2真值真值就是所表示的数的大小,一般用10进制表征。3原码、反码、补码具体概念我就不重复了,只重申下相关结论:a.正数的原码、反码、补码都相同。b.负数的反码为原码的按位取反(保持符号位不变),补码为反码加1.4机器
3、数原码、反码、补码都是机器数的一种表示形式,或说都属于机器数。5存储单元中的数据(存储单元包括存储器中的存储单元和寄存器)在计算机的存储器的存储单元中的数据均以补码形式存放的,于是在计算机中的数据表示有下面结论:a不使用原码与反码。但原码与反码可以作为计算真值的中间媒介。b存储单元中的数据以补码形式存在。c数据的存取与运算都以补码形式进行。d补码就是机器数,机器数就是补码。解释:掌握一个基本原则——简单,存储单元是个很有原则的家伙,他只管存01序列,才不管该序列是表示指令编码还是数据呢,更不会管是有符号数还是无符号数,也不管是数据的原码、反码还是补码。只是人们考虑到0只有在补码中的表示才是
4、唯一的,故规定数据以补码形式在计算机中存储。这就是数据存在的简单原则。要知道,数据在计算机内部的存在形式以及转移、运算过程中,都是一串高低电平组合,如果要在数据转移、运算过程中还要考虑补码、原码、反码的转换,将大大增加硬件复杂度,而这种转换本身也是没有意义的。所以如果你已知某存储单元中的内容是10000001如果要对其进行运算,不需进行任何转化,直接拿出来就行,例如对其加1:10000001+00000001=10000010得到的结果是10000010,要对其进行存储的话,也是不需进行任何转化,直接对号入座:10000010这就是数据存取的简单原则。数据的运算,按常规的二进制运算规则进行
5、,只需保证结果只取后8位。加满就进位,不够减就借位,根据最高位的状态是不是负数以及是否发生了进位与借位。这就是数据运算的简单原则。6数据的运算以及对状态标志位NZCV(以ARM为例)的影响。就是普通的二进制运算规则。结果为0时,Z=1;结果最高位为1时N=1;运算过程中最高位向前面的一位(可以认为该位就是C)进了1,则C=1;运算过程中最高位从前面的一位(可以认为该位就是C)借了1,则C=0;运算中最高位只有进入(carryin)或进出(carryout),或者只有借入(borrowin)或借出(borrowout),则V=1。如对下面两个存储单元中的数据相加:11000111111111
6、00什么都不用管,直接取出来相加,结果为:111000011很容易得到Z=0;N=1;C=1;V=0;7从指令到存储单元可能有些同学对从程序中的数据到存储单元(包括寄存器)中的数据怎样对应还有疑问。以ARM指令为例,如:MOVR0,#0XFFFFFFFF;简单,直接转化成二进制,即32个1,存到存储单元中。MOVR0,#0B100111000011…0001;简单,不用做任何转化,直接存到存储单元中。MOVR0,#35;或MOVR0,#-35;简单,直接转化为二进制补码,存到存储单元中。其实,这些转化都是编译器在编译的过程中进行的,也就是“纯软件”操作。一旦编译完成,把数据存到存储单元中,
7、后面的就依据前面的提到的“三个简单原则”进行了。8从存储单元到指令那么把存储单元中的数,或运算后的数取出来,其真值应该是多少呢?也简单,直接按补码的真值计算方法计算即可。有没有可能是无符号数呢?即使你用unsignedina;定义了一个无符号数,也可以认为是按补码形式存放的,因为如果你这样赋值:a=-1;如果你使用的编译器不报错的话,他也自动给你存的是-1的补码形式。如果你这样赋值:a=65536*65536-1;(即二
此文档下载收益归作者所有