汇编语言 整数的计算表达

     整数有两种表达方式:有符号和无符号。无符号数及正整数,它的表达方法很直接。例如整数200表达为一个字节的无符号整数,对应的二进制值为:11001000

     有符号整数表达起来比较复杂一些。
     例如 -56,+56表达起来很简单,  可以表达为:00111000.
    -56在纸上可以简单的写为 -00111000。但是关键的问题是我们怎样在计算机中表达它呢?这个负符号又该怎么表示呢?

     这里通常有三种方法来表示,这三种方法中有一个共性,那就是都有一个符号位来表示是正数还是负数。这个符号为称为:"sign bit". 为0时表示正数,为1时表示负数。下面来看看三种表达方式:

 

   一、Signed magnitude

      这种方法很简单,把一个整数分成两部分,一部分即前面提到的符号位,一部分为整数值得表达。因此 -56 就表现为 10111000。这种方法一个字节表达的最大值为01111111 或 +127,最小值为11111111 或
-127。这种表现方法非常直观和简洁。
      但是它有它的缺点:
      第一: 0 整数有两种表现值 +0 (00000000) 和 −0
(10000000).
因为0及不是整数也不是负数。所以这两种表现应该在计算机看来应该是同样的值。因此这种表现方法是CPU对于0的操作变得复杂了。

      第二点: 普通的正负数预算变得复杂了。例如 10 加 -56 ,必须先把10 减 去 56得到才能得到。

 

  二、One’s complement

 

       第二种表达方法即:One’s complement。为什么叫One’s complement?故名思义,这种表现方法需要进行一次complement运算。所谓complement运算就是补运算:例如  56 (00111000) 进行一次complement运算后得到11000111. 因此 -56表示为11000111。注意:符号位经过一次
complement之后自动的变为1表示负数。像第一种方法一样,第二种方法中0页有两种表现值+0 (00000000) 和 −0
(10000000).对于CPU在第二种方法中没有任何改观。第二种方法中提供了一种得到负数的技巧。当数字表现为十六进制的时候 例如
56表达为16进制 38,每一位和F相减即得到 C7,这和 -56的16进制数相吻合。

 

   三、Two’s complement

 
        前两种方法应用于早期的计算机中。现代的计算机运用第三种方法,也就是下面所要叙述的这种方法。该方法需要通过两次计算:

  1、整数进行一次complement运算。

  2、运算结果进行加1运算。

       还是以56(00111000)为例:经过第一个步骤得到11000111,然后对于11000111进行加1运算。

                          

  11000111
       + 1
  --------
  11001000

      通过两次计算后 11001000 表示 -56。方法必须保证 -56经过否定可以得到原数。而第三种方法实际上是满足的 :-56经过一次complement运算得到了 00110111,然后再加1

                           

00110111
     + 1
--------
00111000

      看一下结果,很奇怪的-56经过这样地运算得到了56。这个是比较有意思的,不得不佩服这种创造力。但是经过这样相对复杂的计算后才得到一个负数又有什么好处呢?那来看一下前面两种方法提到的弊端,在第三种方法中是否得到了解决。注意一点进位在第三种方法中是去掉的。

      第一:0的表现形式:(00000000),那么它取负之后的结果又是什么呢?0 经过 一次complement运算得到了 11111111 ,然后再加1  
         

11111111
     + 1
----------
1 00000000

        可以看到,去掉进位后的结果正好是00000000。这对于计算机来讲表达形式是同一的,真是变化中的统一。也正好解决了第一种,第二种方法的弊端。用第三种方法,
        一个字节所表示的范围为 -128 - 127

        两个字节十六BIt所表示的范围为 -32, 768 -- +32, 767
        四个字节三十六位所表示的范围为 - 20亿左右 -- + 20亿左右

       CPU实际上并不能理解一个BYTE所要表示的是什么。同样汇编语言也不能理解高级语言所要表达的数据。数据的解析式通过不同的操作码来实现的。例如C语言他的编译器会把有符号数和无符号数编译成不同的操作码,以体现它们之间的差异。

时间: 2024-12-30 14:51:07

汇编语言 整数的计算表达的相关文章

《从问题到程序:用Python学编程和计算》——第3章 基本编程技术 3.1 循环程序设计

第3章 基本编程技术 第2章讨论了简单的计算和编程,展示了一些实例.通过对有关内容的学习,读者应该已经做了一些简单程序,对写程序和做计算有了些实际体会.虽然编程中细节较多,但也是很有趣的工作.为了完成一个程序,首先要分析问题.寻找解决方案,这些需要发挥人的聪明才智和想象力,也可能涉及一些相关领域的知识.要把设计变成可以运行的程序,既需要智力,也需要有条理的工作,一个小错误就可能使程序不能正确执行.当然,高度精确性也是现代社会对人的基本要求,写程序的过程能给我们许多有益的经验. 学习编程要经历一个

微软面试题解析:整数的二进制表示中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1. 例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析: 使用移位操作,来实现. 具体实现如下: #include<iostream> using namespace std; int binary1num(int d) { int cnt = 0; while(d/2 != 0) { if(d%2 == 1) cnt ++; d = d/2; } if(d%2 == 1) cnt ++; return cnt; } in

大半年来做的计算这点事

写一篇随笔,谈谈大半年来做的一些事情. 简单地说,从去年三月份到现在,一直在做一个计算框架:BH,一个core.我对自己的要求是,掌握Spark(和Flink),然后忘了它.所以层面core基本和spark core的层次是一致的,核心是pipeline和DAG.开始做这件事的时候,Flink当时的两层runtime还没统一成pipeline,所以当时与spark core实现思想的主要区分之一就在于pipeline执行.第二个主要区分在于BH的架构更偏向在线.所以我定位BH的核心竞争力是以下几

YARN:下一代 Hadoop计算平台

Apache Hadoop 是最流行的大数据处理工具之一.它多年来被许多公司成功部署在生产中.尽管 Hadoop 被视为可靠的.可扩展的.富有成本效益的解决方案,但大型开发人员社区仍在不断改进它.最终,2.0 版提供了多项革命性功能,其中包括 Yet Another Resource Negotiator (YARN).HDFS Federation 和一个高度可用的 NameNode,它使得 Hadoop 集群更加高效.强大和可靠.在本文中,将对 YARN 与 Hadoop 中的分布式处理层的

《趣题学算法》—第1章1.2节简单的数学计算

1.2 简单的数学计算以上那样利用循环重复将部分数据简单地累加,可以解决很多计数问题.然而,如果计数问题可以通过数学计算直接得出结果,往往可以大大改善算法的时间效率,请看下列问题. 问题1-5 小小度刷礼品图片 7 问题描述 一年一度的百度之星大赛又开始了,这次参赛人数创下了吉尼斯世界纪录.于是,百度之星决定奖励一部分人:所有资格赛提交ID以x结尾的参赛选手将得到精美礼品一份. 小小度同学非常想得到这份礼品,于是他就连续提交了很多次,提交的ID从a连续到b.他想知道能得到多少份礼品,你能帮帮他吗

九大排序算法总结

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 算法一:插入排序 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当

内部排序算法:基数排序

基本思想 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数. 基数排序可以采用两种方式: LSD(Least Significant Digital):从待排序元素的最右边开始计算(如果是数字类型,即从最低位个位开始). MSD(Most Significant Digital):从待排序元素的最左边开始计算(如果是数字类型,即从最高位开始). 我们以L

深入排序算法的多语言实现

 1 排序的基本概念 排序: 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.其确切定义如下: 输入:n个记录R1,R2,-,Rn,其相应的关键字分别为K1,K2,-,Kn. 输出:Ril,Ri2,-,Rin,使得Ki1≤Ki2≤-≤Kin.(或Ki1≥Ki2≥-≥Kin). 排序的稳定性:当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一.在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方

数据结构与算法面试题80道

1.把二元查找树转变成排序的双向链表  题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向.    10  / \  6 14  / \ / \ 4 8 12 16  转换成双向链表 4=6=8=10=12=14=16.    首先我们定义的二元查找树 节点的数据结构如下:  struct BSTreeNode {  int m_nValue; // value of node  BSTreeNode *m_pLeft; // lef