机器数量的原代码逆代码完成代码
基本概念
字
在计算机中,一系列的数字作为一个整体来处理或运算,称为计算机字,简称字。 字通常分为几个字节。 每个字节通常为8位。 存储器通常在每个单元中存储一个字,因此每个字都可以寻址。 字的长度用位数表示。
在计算机的运算器、控制器中,通常以字为单位进行传送。 字根据地址的不同意思也不同。 例如,向控制器发送的数字是指令,而向运算器发送的数字是一个数字。
字很长
字长是指计算机每个字中包含的位数。 字长是CPU的主要技术指标之一,指CPU一次能够并行处理的二进制位数,字长始终为8的整数倍,通常PC的字长为16位(初始)、32位、64位。
字节:
字节是一组相邻的二进制数字。 通常以8位为1个字节。 构成信息的小单位,作为整体参加操作,比字小,是构成字的单位。 在微型计算机中,通常用多少字节表示存储器的存储容量?
机器数量:
机器数(computer number )是将符号“数字化”后的数字,是计算机中的数字的二进制表示。 机器数量有两个特征。 一是符号数字化,二是其数量大小受机器字长的限制。
将的符号数值化。 实用数据有正数和负数。 由于计算机内部的硬件只能表示两种物理状态(用0和1表示),因此机器用一位二进制数的0或1来区分实用数据的正符号“”或负符号“-”。 通常,该符号位于二进制的最高位,称为符号位,0表示符号“”,1表示符号“-”。
二进制的位数受机械设备的限制。 机器内部设备一次能显示的二进制数称为机器的字长,一台机器的字长是固定的。 8位字长称为一个字节(Byte ),机器字长通常为8位、16位、32位、64位等字节的整数倍。
如果十进制数为7,计算机字长为16,则该数字的机器数为0000 0000 0111时,显示为0000 0000 0111;
真值:
因为符号占1位,所以数的形式值不等于真的数值,把与带符号位的机器数对应的数值称为机器数的真值。 例如,二进制真数值-011011,其随机数为1011011。
例如,0000 1100 (机器) 0000 1100 )真)=12; 1000 1100 (机)-00001100 )真)=-12;
机器码原码反码补码的三种表示形式
原代码:
在数字的真值形式中,将“”的编号用“0”、“-”的编号用“1”表示时,称为数字的原代码形式,简称为原代码。 如果计算机字长为n位,x数字为正,则[X]元=X; 当x为负值时,将x的绝对值|X|的符号位设为1即可。
例如(字长为8 ) )。
[ 1]原=0000 0001; [-1]原=1000 0001; 8位二进制文件的范围是[-127,127 ];
反码:
所谓逆编码,是为了解决编码位参与运算而发生的,正数的逆编码是其本身,负数的逆编码是其编码位不变化的剩下的位相反(~)。
[ 1]=[0000 0001]原=[0000 0001]反
[-1]=[1000 0001]原=[1111 1110]反
补数:
补数是用同余的概念引入的,补数的表示规则也很简单,就是:正数的补数期间本身,负数的补数在其反码上再加1
即,x为正: [X]补充=[X]; x为负:[X]补全=[X]逆1;
[ 1]=[0000 0001]原=[0000 0001]反=[0000 0001]补
[-1]=[1000 0001]原=[1111 1110]反=[1111 1111]补
原代码反代码完成代码的由来
原码表示法很直观,其数值部分是其数的绝对值,与真值、十进制的转换非常方便。 但是,加减法很复杂。 两个数相加时,机器首先判断两个数的符号是否相同,如果相同则加两个数,如果符号不同则减去两个数。 在做减法之前,判断两数的绝对值的大小,然后,从大的数中减去小的数,最后确定差的符号。 换句话说,在以这种直接方式进行加法运算的情况下,负数的编码比特不能与其数值部分一起参加运算,必须在单独的线路上确定和的编码比特。
为了解决编码位参加运算问题,引入了逆码,引入了编码位参加运算:
1-1=1(-1 )=[000000001]原([ 1000000001 ]原=[000000001]反) 1111110 )反=[11111111]反=[ 100000000000000 ]原- 0
使用反码时发现特殊值'0',存在0和-0两种原代码,即[ 0000000 ]原和[10000000]原。
为了解决0这个特殊的值,而且反符号运算在循环进位上需要二次运算,所以引入补数。
`1-1=1(-1 )=[ 000000001 ]原([10000001] )=[ 0000000001 ]补) 1111111 )补=(10000000 )补=[ 00000000000 ]原=0; `
同样,不存在0和-0的问题,并且[1000 0000]可以表示-128
即-1(127 )=[1111 1111]补充([1000 0001] )补充=[1000 0000]补充,但计算机实际上用-0表示-128。
所以-128并没有原码和反码.使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].
因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1]即[0x80000000,0x7fffffff], 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
同余概念
同余定理:给定一个正整数m,如果两个整数a和b满足(a-b)能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。
假定当前时间为北京时间6点整,有一只手表却是8点整,比北京时间快了2小时,校准的方法有两种,一种是倒拨2小时,一种是正拨10小时。若规定倒拨是做减法,正拨是做加法,那么对手表来讲减2与加10是等价的,也就是说减2可以用加10来实现。这是因为8加10等于18,然而手表最大只能指示12,当大于12时12自然丢失,18减去12就只剩6了。这说明减法在一定条件下,是可以用加法来代替的。这里“12”称为“模”,10称为“-2”对模12的补数。推广到一般则有:
A – B = A + ( – B + M ) = A + ( – B )补
反码的运算规则
1.反码运算时,其符号位与数值一起参加运算。
2.反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。
3.用反码运算,其运算结果亦为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。
如 x=+1101,Y=+0110,用反码计算Z=X-Y;
[01101]反+[11001]反=[01101]+[11001]+1=[00111]反;其真值Z=+0111;
采用反码运算较好的解决了原码运算所遇到的困难或问题,但由于循环进位需要二次算术相加,延长了计算时间,这同样给电路带来麻烦。而采用下述的补码运算则可避免循环进位的两次计算,同时,采用补码运算对溢出的判断也较采用反码简单的多,所以机器中的算术运算普遍采用补码运算。
补码运算规则
1.补码运算时,其符号位与数值部分一起参加运算。
2.补码的符号位相加后,如果有进位出现,要把这个进位舍去(自然丢失)。
3.用补码运算,其运算结果亦为补码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求补才是其真值。
如:X=+1101,Y=+0110,用补码计算Z=X-Y;
[X]补+[-Y]补=[01101]补+[11010]补=01101+11010=100111,其真值为Z=+0111;
如X=+0110,Y=+1101,用补码计算Z=X-Y;
[X]补+[-Y]补=[00110]+[10011]=[11001]补,其真值为Z=-0111.
溢出及补码溢出的判断
无论采用何种机器数,只要运算的结果大于数值设备所能表示数的范围,就会产生溢出。 溢出现象应当作一种故障来处理,因为它使结果数发生错误。异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。
由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位。
例如,某数字设备用5位二进制表示数,其数字范围为[-16,15],如果两数字相加减得到的数字超出该范围则溢出.如:
[+9]补+[+3]补=01001+00011=01100=+12;正确
[-9]补+[-3]补=10111+11101=110100=10100(符号位进位自然丢失),真值为-1100=-12;
[+9]补+[12]补=01001+01100=10101,真值为-1011=-11;溢出
[-9]补+[-12]补=10111+10100=101011,真值为01011=+11,溢出
一般可以用异或(^)来判断补码溢出问题(单符号位补码):
运算结果,若 Cs^Cp =0 无溢出,若 Cs^Cp =1 有溢出,
(Cs是符号位的进位,Cp是最高数值位的进位,^表示异或)