计算机发明的初衷就是用于帮助我们加工和处理数据,虽然时至今天计算机看起来无所不能,但它根本上还是在做数据的加工和处理,数据的机器层次表示将直接影响到计算机的结构和性能。

  在计算机中,采用数字化方式来表示数据,数据有无符号数和带符号数之分,其中带符号数根据其编码的不同又有原码、补码和反码3中表示形式。下面我们来认识一下;

无符号数和带符号数

  所谓无符号数,就是整个机器字长的全部二进制位均表示数值位(没有符号位),相当于数的绝对值,大致相当于数学中的自然数。如01000001表示无符号数65,11000001表示无符号数193。机器字长为n+1位的无符号数的表示范围是0 ~(2^(n+1) - 1),此时二进制的最高位也是数值位,其权值等于2^n。如字长为8,那么数的表示范围就是0~255。一般计算机中都会有一些无符号数的运算和处理指令,如条件转移指令等。

  然而,如同我们现实世界所见的大部分数据一样,它还是需要区分正负(“+”“-”)的。在日常生活中我们使用正负和绝对值来表示数值的大小,用这种形式表示的数值在计算机技术中称为“真值”。

  对于数的符号“+”和“-”,计算机是无法识别的(实际上除了0和1,计算机什么也识别不了),因此需要把符号数码化。通常约定二进制数的最高位为符号位,“0”表示正号,“1”表示负号。这种在计算机中使用的表示数的形式称为机器数,常见的机器数有原码、反码和补码等不同的表现形式。

  区别于无符号数,带符号数的最高位被用来表示符号,如上面的01000001表示带符号数为正65,11000001表示带符号数为-65。为了能正确的区别出真值和各种机器数,我们用X表示真值,[X]原表示原码,[X]补表示补码,[X]反表示反码。原码、补码和反码是计算机中的几种表现形式,目的在于能够使计算机对数据的一系列运算得出正确结果。

原码表示法

  原码表示法是一种最简单的机器数据表示法,其最高位是符号位,数值部分则与真值相同。

  若真值是纯小数,那么原码的定义为:

        [X]原 = X   0<=X<1

        [X]原 = 1-X = 1+|X|   -1<X<=0

  若真值为纯整数,它的原码定义为:

        [X]原 = X   0<=X<2^n

        [X]原 = 2^n-X = 2^n + |X|   -2^n<X<=0

  因为原码具有符号位,所以原码中的0是有两种表示形式的

        [+0]原 = 00000

        [-0]原 = 10000

  原码表示法的优点是直观易懂,机器数和真值间的相互转换很容易,用原码实现乘除运算阿德规则很简单;缺点则是实现加减运算的规则较为复杂.

补码表示法

  在介绍补码之前,先认识一下模和同余。

模和同余

  我们这里所说的模和通常所见的模数是不同的概念,这里所说的模(Module)是指一个计量器的容量,可用M表示。例如:一个4位的二进制计数器,当计数器从0开始计数到15之后,再加1,计数器的值就又会变成0。这个计数器的容量M = 2^4 = 16,即模为16。由此可见,纯小数的模为2(二进制计数中对于纯小数,它们的模永远都是2,因为一旦小数位全为1后就会进位位整数位,所以小数位的周期都是2,即模数(容量)为2。),一个字长为n+1位的纯整数的模为2^(n+1)。

  同余概念是指两个整数A和B除以同一个正整数M,所得余数相同,则称A和B对M同余,即A和B在以M为模时是相等的,可写作

            A = B(mod M)

  生活中最常见的同余莫过于时钟了,对于时钟而言,其模M = 12,故4点和16点、5点和17点、……均是同余的,它们可以写作

            4 = 16(mod 12) 5 = 17(mod 12)

  利用模和同余概念的补码表示法在进行算术运算时可以使减法运算转化成加法运算,从而简化机器的运算器电路。

  还以时钟为例,假如时钟停留在8点,而现在正确的时间是6点,这时拨准时种的方法有两种:

  • l 将分针倒着拨两圈(即倒拨两小时)8-2=6(这是通过减法实现的)。
  • l 将分针正着旋转10周(即正拨10小时)8+10=6(mod 12)(这是通过加法实现的)

  此时  8 - 2 = 8 + 10(mod 12)

  设:A = -2 , B = 10

  则:10/12 = (12-2)/12 = 1 + (-2/12)

  上面-2和10也是同余。同余的两个数具有互补的关系,-2和10对模12互补,也就是说-2的补数是10(以12位模)。

  由此可见,只要确定了“模”,就可找到一个与负数等价的正数(该正数即为负数的补数)来代替此负数,而这个正数可以用模加上负数本身求得,这样就可把减法运算转换为加法运算实现了。而将补数概念运用到计算机中就出现了补码这种机器数。

    [X]补 = X (mod M)   0 <= X < M/2

    [X]补 = (M + X)(mod M)     (-M/2) <= X < 0

补码表示

  补码的符号位表示方法和原码相同,其数值部分的表示与数的正负有关:对于正数其数值部分与真值形式相同;对于负数,将真值的数值部分按位取反,且在最低位上加1。

  若真值为纯小数,它的补码表示为:

  [X]补 = X (mod 2)   0 <= X < 1

  [X]补 = (2 + X)(mod 2) = (2-|X|)(mod 2)     -1 <= X < 0

  若真值是纯整数,它的补码为:

  [X]补 = X   0<=X<2^n

  [X]补 = X + 2^(n+1) = 2^(n+1) - |X|   -2^n<X<=0

  在补码表示中,0的表示形式是唯一的:

  [+0]补 = [-0]补 = 00000

反码表示法

  反码表示法与补码表示法有许多类似之处,对于正数,数值部分与真值形式相同;对于负数,将真值的数值部分按位取反。它与补码的区别是末位少加一个1,因而很容易从补码的定义推出反码的定义。

三种机器数的比较与转换

  通过上面的学习,我们知道数值在计算机中的三种表现形式,下面我们针对这三种数据进行比较学习;

比较

  原码、反码、补码这三种机器数既有共同点,又有各自不同的性质,主要区别有一下几点:

  • l 对于正数它们都等于真值本身,对于负数有各自的表现形式。
  • l 最高位都用来表示符号位,补码和反码的符号位可作为数值位的一部分看待,和数值一起参与运算;但原码的符号位不允许和数值位同等看待,必须分开处理。
  • l 对于真值0,原码和反码各有两种不同的表现形式,而补码只有唯一的表现形式。
  • l 原码、反码表示的正负数范围相对零来说是对称的;但补码负数表示范围较正数表示范围宽,能多表示一个最负的数(绝对值最大的负数),其值等于-2^n(纯整数)或-1(纯小数)。

Knowledge Point 20180305 数据在计算机中的表示的更多相关文章

  1. Knowledge Point 20180305 补位的两种方式

    我们都知道Java的基本数据类型内存中都有一个固定的位数(内存分配空间),如byte占8位,int占32位等.正因如此,当把一个低精度的数据类型转成一个高精度的数据类型时,必然会涉及到如何扩展位数的问 ...

  2. Knowledge Point 20180305 机器数转换与进制转换

    机器数(这里的机器数说的就是数值在计算机中的存储形式,相关可以了解数据在计算机中的表示)之间的转换往往是通过原码来实现的,下面我们结合进制来来一下: 进制也就是进位制,是人们规定的一种进位方法. 对于 ...

  3. Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

    要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...

  4. 计算机中位(bit), 字节(byte), 字(word)的关系

    1.位(bit) 来自英文bit,音译为“比特”,表示二进制位.位是计算机内部数据储存的最小单位,11010100是一个8位二进制数.一个二进制位只可以表示0和1两种状态(21):两个二进制位可以表示 ...

  5. (转)原始图像数据和PDF中的图像数据

    比较原始图像数据和PDF中的图像数据,结果见表1.1.表1.1中各种“解码器”的解释见本文后续的“PDF支持的图像格式”部分,“PDF中的图像数据”各栏中的数据来自开源的PdfView.如果您有兴趣查 ...

  6. 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理

    使用程序获取整型数据和浮点型数据在内存中的表示. C++中整型(int).短整型(short int).单精度浮点数(float).双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不 ...

  7. 计算机中的大小端模式及C语言中如何鉴别他们

    我的博客:www.while0.com 参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544 写的很详细. 大小端主要是对数字类型来 ...

  8. C/C++数据在内存中的存储方式

    目录 1 内存地址 2 内存空间   在学习C/C++编程语言时,免不了和内存打交道,在计算机中,我们存储有电影,文档,音乐等数据,这些数据在内存中是以什么形式存储的呢?下面做一下简单介绍. 本文是学 ...

  9. 聊聊计算机中的编码(Unicode,GBK,ASCII,utf8,utf16,ISO8859-1等)以及乱码问题的解决办法

    作为一个程序员,一个中国的程序员,想来“乱码”问题基本上都遇到过,也为之头疼过.出现乱码问题的根本原因是编码与解码使用了不同而且不兼容的“标准”,在国内一般出现在中文的编解码过程中. 我们平时常见的编 ...

随机推荐

  1. Aaja.pro 未定义

    问题描述:安装新系统后,将代码迁至新系统,所有用到ajaxpro框架调用ajax方法时均报“xx未定义”的错: 解决问题的过程 : 1.看看你在前台调用的方法的命名空间,方法名和后台的是否对应.在后台 ...

  2. SQL 脚本整理 笔记

    1.视图 存储过程 触发器 批量加密(With Encryption),单个解密 在运行过程中自己找不到启用DAC 的地方,链接的时候需要在服务器名称前面添加ADMIN:,如本机是ADMIN:WP-P ...

  3. linux修改文件权限命令(chmod)

    chmod命令是用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限. 该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1.文字设定法 chmod ...

  4. 如何更新maven需要的jar包

    第一次使用maven,检出项目生成时出现缺少xxx.jar,目录在C盘下: 拿mybatis-spring-1.2.2.jar来说,发现在C:\Users\Administrator\.m2\repo ...

  5. IMG标签与before,after伪类

    在CSS中总有一些你不用不知道,用到才知道的“坑”.比如今天要谈的,把 before, after 伪类用在 <img> 标签上.嗯,实际上你用你会发现,在大多数浏览器这是无效的,dom中 ...

  6. android 自定义

    初级: 1.Android自定义View之一:初探实例 ——> onDraw 2.getwidth和getmeasuredwidth的区别以及两者的使用场景 3.Android 自定义View ...

  7. spring学习(四)spring 持久层的封装

    持久层:所谓“持久层”,也就是在系统逻辑层面上,专著于实现数据持久化的一个相对独立的领域(Domain),是把数据保存到可掉电式存储设备中.持久层是负责向(或者从)一个或者多个数据存储器中存储(或者获 ...

  8. ARM 中可用性集使用的注意事项

    Azure 目前有两种部署模型:经典部署模型 (ASM) 和资源管理器 (ARM).如果您之前使用过 ASM 模式下的可用性集,那么很可能在使用 ARM 模式下的可用性集时,会遇到一些问题或者疑惑.这 ...

  9. ios端微信浏览器禁止上下滑动

    在body里的第一个div容器中添加 position:fixed

  10. 深入理解JVM读书笔记思维导图

    为了证明我已经啃完这本书然后买新书不用剁手...脑图画了8个钟,感觉整个人都不好了T_T 脑细胞不知道死了多少... 其实没吃透,估计若干年后要重新翻开来看...