如何进行网站分析,58同城如何发布网站建设,站长seo软件,微信小程序优秀案例1、原码、反码、补码知识的复习#xff1a; 三者的最高位均为符号位。我以前一直没弄明白的是为何8位补码的表示范围是-128~127#xff0c;今天查阅了相关资料#xff0c;于此记下。 仍然以8位为例#xff1a; 原码的表示范围#xff1a;-127~-0#xff0c;0~127#xf…1、原码、反码、补码知识的复习 三者的最高位均为符号位。我以前一直没弄明白的是为何8位补码的表示范围是-128~127今天查阅了相关资料于此记下。 仍然以8位为例 原码的表示范围-127~-00~127共256个数字。正0的原码是0000 0000负0的原码是1000 0000有正0负0之分不符合人的习惯待解决。 反码除符号位原码其余位取反而得。00000 0000-01111 1111仍然有正0负0之分。 补码在反码的基础上加1而得。对原码的两种0同时末位加1。00000 0000-00000 0000因为溢出导致8位全0。消除了正0负0之别如此一来便节省出一个数值表示方式1000 0000不能浪费用来表示-128。-128特殊之处在于没有相应的反码原码。也可以这样考虑 -1 1111 1111 -2 1111 1110在-1的基础上减1直接将补码减1即可 -3 1111 1101在-2补码基础上减1以下类似 -4 1111 1100 …… -1271000 0001 -1281000 0000 如此以来8位补码表示范围是-128~127因为0只有一种形式所以仍然是256个数若8位代表无符号数则表示范围是0~255这就是为什么高级语言讲到数据类型比如C中的short类型时16位长说其表示范围是-32768~32767而unsigned short表示的范围则是0~65535 2、关于无符号数和有符号数 无符号数及有符号数的定义就不多说了任何计算机基础书籍都会讲到。 二者的区别我们知道有符号数在计算机中以补码的形式存储无符号数其实就是正数三码一致存储形式即是其十进制真值对应的二进制数。所以可以这样说无论有符号数还是无符号数都是以补码相对真值来说的形式来存储的补码在运算是符号位也会参与。 其实对计算机来说它根本没有所谓的无符号有符号这样的约定机制无符号有符号只不过是我们程序员、学习者看待二进制数据的方式比如对于16位的寄存器比如ax有符号数-1的存储形式是0FFFFH即16个1-1的补码最高位符号位而同时无符号数65535的存储形式也是0FFFFH。所以对计算机来说它仅仅是存储了一串二进制至于是有符号数还是无符号你程序员要心中有数。C代码举例 short a-1;
unsigned short ba;
coutaendl;//打印有符号数-1对应存储形式0FFFFH
coutbendl;//打印无符号数65535对应存储形式0FFFFH 3、汇编相关 已经说过数据以补码形式存储于计算机中有符号、无符号自然寄存器比如ax存的也是补码比如mov ax-96查看便知ax存储的是0FA0H。在高级语言编程中我们完全不用考虑什么原码补码。汇编的add指令在运算时比如 mov al,0 add al,-1 它不去“考虑”什么有符号无符号反正数据都以补码无符号数据便是正数补码不变的形式存储、运算它只管将al中的补码与99的补码加一起然后存入al中(补码的运算特点是符号位也参与运算我们知道运算后al存储的是1111 11110FFH至于你如何看待这个结果由你程序员控制你看成有符号数它便是-1看成无符号数它便是255。 与此同时相关的寄存器也会有相应的机制来配合编程人员。比如标志寄存器中的SF标志位如果编程人员将数据看成无符号数则我们SF对我们是毫无意义的——尽管对我们毫无意义但计算机依然以“有符号数”的态度来“看待”参与运算和存储的数据比如 mov ax,12 add ax,-18 结果为负sf1结果如果为非负则sf0 计算机不管编程人员以什么眼光有符号无符号来看待数据反正它把所有的可能都考虑到了把相应的工作也做了编程人员可按需而来。不妨想象一种情景假如计算机完全以无符号数来看待数据压根没有sf标志位那么如果程序员想知道某数据的正负以有符号数来看待数据时便无从下手了。 可以说计算机仁至义尽剩下的便是程序员的事了。 4、汇编中的CF、OF、SF标志位及cmp操作 CF对无符号数运算是有意义的OFSF对有符号数而言是有意义的。ZF则都适用。 一个是进位借位标志位一个是溢出标志位溢出是指在进行有符号数运算时结果超过了机器所有表示的范围五爽《汇编语言》可知OF只对有符数运算有意义无符号数不关心这种溢出。无符号数关心的是最高位向更高位借位进位问题。从这个层面上来讲其实也可将这种向更高位借位进位看成无符号数的“溢出”。所以CF只对无符号数的运算有意义即当考虑CF标志位的时候要做到心中有数现在参与运算的都是无符号数——这依然是程序员的事。 可能会有这样的疑问两个数运算如果溢出了那么以“无符号的眼光”看来不也是产生了借位或者进位吗或者反之两个数运算如果进位或者借位了那么以”有符号的眼光“看来不也是产生了溢出吗 对于第一个问题不一定比如0111 11110000 0001看成有符号数运算的话结果明显溢出但如果看作无符号的运算的话并没有向更高位无符号数无符号位均为数值位)进位。 又如mov al,98 add al,99(即0110 00100110 0011运算后CF0OF1。具体的过程可以这样考虑 首先用的是al来运算所以计算机知道做的是8位运算加得结果1100 0101对于无符号来说无进位CF0对于有符号来说溢出了OF1. 对于第二个问题也不一定。如 mov al,0F0H add al,88H执行后CF1OF1但是请看另一例 mov al,0F0H add al,78H 对于0F0H和78H首先要明白如果看作无符号数则便是240120明显会在高位向更高位产生进位所以CF1如果看作有符号数作为人类的程序员有两种方式可以判定是否溢出 a、将0F0H和78H补码转换成10进制数值按照符号位不变其余位取反然后末位加1转成原码再求相加看是否在-128~127之内。也可按补码求真值的公式直接求出补码对应的真值真值x-2^n*xn其余各位2进制对应真值。其中xn为最高位即符号位为0或者1。 b、单符号判溢出方法这是组成原理白中英主编第4版介绍的判断溢出的方法补码相加看符号位及最高有效位。将16进制的补码转换成2进制1111 0000和0111 1000相加 1111 0000 0111 1000 可看出最高有效位有符号位均产生了进位这种情况不视为溢出只有二者之一产生进位时才算溢出。 有符号数的溢出问题引发了cmp操作的相关问题。 cmp是比较指令相当于减法但不会将结果保存在目的操作数中但会影响标志位sfzfcf。利用它既可以对无符号数比较也可以对有符号数进行比较。至于是有符号数还是无符号数这依然取决于我们的看待方式如 mov ax,8 mov bx,3 cmp ax,bx 看成无符号数分析因为无须借位cf0据此可以判断axbx)因为结果不为0zf0(据此可以判断ax bx是否相等 对于有符号数情况要复杂一些因为牵扯到了溢出问题。 比如已知ah)22H,(bh)0A0H二者都是补码一个为正一个为负二者对应的真值分别为34和-96逻辑上讲(ah)(bh)但cmp ah,bh运算时会溢出34--96-230小于-128。另外我们可以直接用16进制减法手动计算结果 22 A0 --------- 82H即1000 0010知结果为-1*2^72-126这显然是个错误的结果。计算机不会进行减法它得转成加法。用补码加法计算有个好处可用上边已经介绍过的单符号位判溢出方法判断结果是否溢出。过程x补22H0010 0010y补1010 0000求x补-y补这是补码减法转换成加法x补-y补x补[-y]补由y补求[-y]补:包括符号位全部取反然后末位加1参照白中英组成原理课本相关内容转变后即为0010 00100110 0000由单符号位判溢出方法可知只有高位有效位产生了进位进给了符号位这是一个溢出一个上溢。 要注意的是引入补码带来的便处之一使得负数的加法转成补码的加法负数的加法便是减法但是如果不加控制补码之间也会进行减法此时也要将相应的减法转成加法运算当然这种转换的工作不是我们所做的转换的原理如上所述。 因为溢出问题导致上面cmp结果为负sf1如果仅据此就说(ah)(bh)明显是错误的此时还要结合of位因为有溢出所以of1如果of等于0说明没有溢出则我们可以放心地使用sf来判断。一条规律是有溢出则cmp结果与of表示的相反本来打算验证一下还是算了抱着复习相关知识的心态写了这么多蛋疼。 转载于:https://www.cnblogs.com/qzhforthelife/archive/2012/10/30/2746918.html