首页 > 编程知识 正文

-35的原码反码补码,单片机原码反码补码

时间:2023-05-03 22:02:55 阅读:174675 作者:3130

机器数量的原代码逆代码完成代码

基本概念

在计算机中,一系列的数字作为一个整体来处理或运算,称为计算机字,简称字。 字通常分为几个字节。 每个字节通常为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是最高数值位的进位,^表示异或)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。