zoukankan      html  css  js  c++  java
  • (转)汇编-补码

    以8位的数据为例,对于无符号数来说是从00000000b~11111111b到0~255一一对应的。那么我们如何对有符号数进行编码吗?即我们如何用8位数据表示有符号数呢?

    既然表示的数有符号,则必须要能够区分正、负。

    首先,我们可以考虑用8位数据的最高位来表示符号,1表示负,0表示正,而用其他位表示数值,如下:

    00000000b

    0

    00000001b

    1

    00000010b

    2

    01111111b

    127

    10000000b

    ???

    10000001b

    -1

    10000010b

    -2

    11111111b

    -127

    可见,用上面的表示方式,8位数据可以表示-127~127的254个有符号数。从这里我们看出一些问题(注意问号处),8位数据可以表示255种不同的信息,也就是说应该可以表示255个有符号数,可用上面的方法,只能表示254个有符号数。注意,用上面的方法,00000000b和10000000b都表示0,一个是0,一个是-0,当然不可能有-0。可以看出,这种表示有符号数的方法是有问题的,它并不能正确地表示有符号数。

    我们再考虑用反码来表示,这种思想是,我们先确定用00000000b~01111111b表示0~127,然后再用它们按位取反后的数据表示负数。如下:

    00000000b

    0

    11111111b

    ???

    00000001b

    1

    11111110b

    -1

    00000010b

    2

    11111101b

    -2

    01111111b

    127

    10000000b

    -127

    可以看出,用反码表示有符号数存在同样的问题,0出现重码(注意问号处)。

    为了解决这种问题,采用一种称为补码的编码方法。这种思想是:先确定用00000000b~01111111b表示0~127,然后再用它们按位取反加1后的数据表示负数。如下:

    00000000b

    0

    11111111b + 1 =00000000b

    0

    00000001b

    1

    11111110b + 1 =11111111b

    -1

    00000010b

    2

    11111101b + 1 =11111110b

    -2

    01111111b

    127

    10000000b + 1 =10000001b

    -127

    观察上面的数据,我们可以发现,补码方案中:

    1)最高位为1,表示负数;

    2)正数的补码取反加1后,为其对应的负数的补码:负数的补码取反加1后,为其绝对值,比如:

    1的补码为:00000001b,取反加1后为:11111111b,表示-1;

    -1的补码为:11111111b,取反加1后为:00000001,其绝对值为1。

    我们从一个负数的补码不太容易看出它所表示的数据,比如:11010101b表示的数据是多少?

    但是我们利用补码的特性,将11010101b取反加1后为:00101011b,可以知11010101b表示的负数的绝对值为:2BH,则11010101b表示的负数为-2BH。

    那么-20的补码是多少呢?

    用补码的特性,-20的绝对值是20,00010100b,将其取反加1后为:11101100b。可知-20H的补码为:1101100b。

    那么10000000b表示多少呢?

    10000000b取反加1后为:10000000b,其大小为128,所以10000000b表示-128。

    8位补码所表示的数的范围:-128~127。

    补码为有符号数的运算提供了方便,运算后的结果依旧满足补码规则。

    比如:

    计算

    补码表示

     

    10

    00001010b

     

    +(-20)

    11101100b

    结果

    -10

    11110110b

    计算

    补码表示

     

    10

    00001010b

     

    +(-128)

    10000000b

    结果

    -118

    10001010b

  • 相关阅读:
    spring培训PPT
    如何创建新模块 DotNetNuke 6 & Entity Framework Code First
    博客园 漂浮快捷操作
    Ext.net中如何上传文件
    Excel与数据库之间的那些事
    关于SQL一对多关系转换的效率思考
    JQuery的结构Dive into jQuery
    《JAVA与模式》之简单工厂模式
    JSM SqlHelper 2.0 新特性(C#)
    mutex互斥锁
  • 原文地址:https://www.cnblogs.com/yuanqi/p/3565542.html
Copyright © 2011-2022 走看看