整数在计算机中是使用补码表示的,在讲解补码前,先看一下相关概念。

机器数与真值

数值在计算机中的表现形式叫做机器数,该数值就是机器数代表的真值。机器数是真值在计算机中的表现形式,真值是机器数的代表的数值。

比如5在计算机中的表现形式是00000101,所以00000101就是5的机器数,5就是机器数00000101所代表的真值。

整型数在计算机中的编码方式

C语言中的整型数分为有符号数和无符号数两种类型,无符号数代表的都是非负整数,所以在计算机中直接用二进制值表示就可以,但是有符号数既可以表示正整数,也可以表示负整数,所以有符号数在计算机中不能直接用二进制值来表示,需要使用补码的方式来表示。

有符号数在计算机中的编码方式

编码方式是为了解决有符号数在计算机中的表示方式。计算机中的编码方式主要有原码,反码,补码三种方式。

原码

假定机器字长4字节,原码的编码方式规定如下:

最高位是符号位,用0代表正数,用1代表负数,其它位就是真值的绝对值对应的二进制值,比如十进制数5的二进制值是101,又因为5是正数,所以最高位是0,其它位是0000000 00000000 00000000 00000101,完整格式如下:00000000 00000000 00000000 00000101。

上面描述了正数的原码,下面我们看一下负数的原码,比如-5,因为它是负数,所以最高位用1表示,又因为-5的绝对值是5,所以它的绝对值是101,因为它的原码是10000000 00000000 00000000 00000101。但是原码有两个问题,一个是0有两种表示方式,这不符合数学习惯,另一个问题是[5]+[-5]=[10000000 00000000 00000000 00001010]=-10!=0,所以使用原码无法实现正负数的加法运算,也就是说不能实现5-5=0。

反码

为了解决原码中两个正负数相加不等于0的问题,人们设计了反码,反码的规定如下:

正数的反码就是原码,负数的反码最高位是符号位,其它位是它所对应的原码除符号位之外,其它位全部取反。就是原码中除符号位外,0变1,1变0。比如5的原码是00000000 00000000 00000000 00000101,因为5是正数,所以它的反码和原码一样。再比如-5的原码是10000000 00000000 00000000 00000101,因为它是负数,所以除了符号位,其它全部取反,所以它的反码是11111111 11111111 11111111 11111010,所以5-5=[00000000 00000000 00000000 00000101]+[11111111 11111111 11111111 11111010]=[11111111 11111111 11111111 11111111] = -0,因为0无所谓正负,所以它代表的就是0,所以反码解决了原码相对数相加不等于0的问题,但是,0分为正0和负0不符合数学习惯,所以人们继续改进,发明了补码。

补码

正数的补码和原码、反码一样,负数的补码为它的反码加1,所以5-5=5+(-5)=[00000000 00000000 00000000 00000101]+[11111111 11111111 11111111 11111010]= 00000000 00000000 00000000 00000101]+[11111111 11111111 11111111 11111011]= [00000000 00000000 00000000 00000000]=0,所以补码解决了正负数相加不等于0的问题,又因为-0的反码加1和+0的补码一样,所以在补码中,0只有一个,就是[00000000 00000000 00000000 00000000],因此,在计算机中有符号数采用补码表示。

补码的数学原理

假设在计算机中用一个字节来表示整数,那么总共可以表示256个整数,如果这些数都是无符号数,那么表示范围是0~255。所以如果是两个无符号数相加,CPU设计就会非常容易,直接对这两个数做二进制运算就可以,但是,有符号数怎么办,因为有符号数涉及符号位的表示,减法的运算,所以如果用正常的逻辑思路去设计CPU的运算器,就需要解决符号位和减法运算的问题,这样CPU的设计就会非常麻烦,而且效率也不高,因此,有人想到了同余数的概念,同余数告诉我们在有限的连续变化空间内,一个二进制数代表的不仅是这一个数,而是与这个值同余的所有整数,比如11111111这个数既可以表示255,也可以表示-1,为什么呢?因为在1个字节存储空间的情况下,-1和255模256相等。又因为同余数的两个性质,一个是数a本身就是自己的同余数,另一个就是如果两个数a和b对m同余,并且c和d也是对m同余,那么,a+c和b+d对m同余。同余的本质就是说这些数对应的位置相同,因此,两个数a和b的减法,就可以表示成a和(-b)对m的补码的加法,

并且它们对应的结果一样,这样就可以将有符号的减法运算转换为无符号的加法运算。下面,我们再具体论证一下,为什么它们的结果相等?因为a和自己是同余数,所以a和a对256同余,又因为-b和-b的补码对256同余,所以a-b和a+(-b的补码)对256同余,又因为同余代表的是同一个位置,所以a-b的结果与a+(-b的补码)的结果一样,因此,补码利用同余数的原理将有符号的减法转换为无符号的加法,从而简化了CPU运算器的设计。

如果还有不明白的地方可以在我的订阅号上留言,我发现后会尽可能回复。

我的订阅号二维码如下:

整数在计算机中的编码相关推荐

  1. 整数在计算机中的表示

           整数包含正整数,负整数和0.从数学的角度来讲,整数是无穷无尽.列举不完的,整数的大小是没有限制的.但是,如果用计算机来表示整数,则不然.因为计算机是靠数字信号来表示数,计算机所能处理的整 ...

  2. 整数在计算机中是如何存储的?

    整数在计算机中是如何存储的? 无符号整数按其二进制的形式直接存储 有符号整数按其补码的形式存储 以8位二进制数为例: 无符号整数存储范围:0~2^8 - 1 [0, 255] 有符号整数存储范围:-2 ...

  3. 整数在计算机中的存储

    整数在计算机中是以二进制的补码存放的. 整数的二进制形式有三种:原码,补码,反码 源码:直接将整数转化为二进制 反码:整数的二进制进行按位取反(就是将所有的1转化为0,所有的0转化为1) 反码的符号位 ...

  4. 在计算机中1byte有符号整数,在计算机中1BYTE无符号整数 有符号整数取值范围 是什么意思.......

    意为在二进制的条件下,1Byte=8bit,1BYTE有符号取值范围是负1111111到正1111111,在有符号规则下,第一位0和1代表数字的正负. 1Byte=8bit,二进制下,无符号整数取值范 ...

  5. 浮点数在计算机中的编码方式

    在阅读<C++反汇编与逆向分析技术揭秘>一书中遇到了一个有趣的问题,摘出来跟大家分享下. 浮点数编码转换采用的是IEEE规定的编码标准,float和double这两种类型数据的转换原理相同 ...

  6. 计算机中字符编码换算

    一个二进制,就是一个1或0 表示一个位,即1bit 八个位表示一个字节 1byte=1B 1比特=1位(1byte=1B) 1字节=8byte=8B 1KB=1024B 1MB=1024KB 1GB= ...

  7. 使用计算机制作数字文本格式,计算机中数字、文字、图像、声音和视频的表示与编码...

    设计计算机的最初目的是进行数值计算,计算机中首先表示的数据就是各种数字信息.随着应用的发展,现在计算机数据以不同的形式出现,如:数字.文字.图像.声音和视频等.但是,在计算机内部,这些数据形式还是以数 ...

  8. 计算机中的数制与编码教程,第一章计算机中的数据和编码教程.doc

    第一章计算机中的数据和编码教程 第一章 计算机中的数据和编码 1.1计算机中的数制 1.2计算机中数的表示 1.3计算机中的编码 1.1 计算机中的数制之进位计数制 进位制: 按照进位的方法进行计数的 ...

  9. 整数在计算机里的表示

    整数的表示其实是比较简单的,无非是解决符号位.数字表示的唯一性等问题. 整数在计算机中是使用补码表示的,在讲解补码前,先看一下相关概念. 机器数与真值 数值在计算机中的表现形式叫做机器数,该数值就是机 ...

最新文章

  1. 出国留学想申请国家留学基金委的奖学金?传说中的csc! 从这里入手就对了!
  2. 第三章JavaScript 内置对象
  3. 后台无刷新修改字段js
  4. shell编写mysql启动脚本文件夹_linux 编写一个shell脚本文件,实现以下功能
  5. A1075.PAT Judge
  6. QT项目开发与团队合作
  7. vba编程把纯文本转换成html,如何在Excel的单元格中将HTML转换为文本?
  8. linux 显示文件多少行
  9. MySQL学习笔记:MySQL管理
  10. 苹果明年或将推出升级版iPhone 8 人人都用得起?
  11. 鸿蒙面向开发者语言,华为正式发布鸿蒙OS 面向全球开发者开源!
  12. Druid创始人Eric Tschetter详解开源实时大数据分析系统Druid
  13. mysql数据库加载太慢_MySQL数据库导致网站打开速度慢的解决思路
  14. gif图片裁切、压缩导出无水印图片(保姆级教程,亲测可用)
  15. 【密码学/密码分析】基于TMTO的密码分析方法
  16. 啊哈添柴挑战Java1611. 反向输出练习(难)
  17. 香港股市api调用代码返回示例
  18. ArduinoIDE初步开发ESP8266时钟
  19. DHL供应链将再投资2.18亿欧元加码中国市场
  20. 光伏最大功率点跟踪(MPPT)Simulink

热门文章

  1. c语言勤工助学信息管理系统,勤工助学
  2. esp8266的SDK开发pwm有感:解决LED灯不能熄灭,微微亮问题。
  3. Python 编码规范(Google)
  4. centos6配置DNS
  5. CCA,rCCA,gCCA
  6. 树莓派3B+安装python3
  7. 北京化工大学 计算机专硕 缺额,北京化工大学2020年硕士研究生调剂工作办法
  8. AHOI 2002 黑白瓷砖
  9. 查看parquet文件工具parquet-tools
  10. 面向对象程序设计(Java)chapter01