众所周知,每种基本数据类型都有一个固定的位数,比如byte占8位,short占16位,int占32位等。正因如此,当把一个低精度的数据类型转成一个高精度的数据类型时,必然会涉及到如何扩展位数的问题。这里有两种解决方案:
(1)补零扩展:填充一定位数的0。
(2)补符号位扩展:填充一定位数的符号位(非负数填充0,负数填充1)。
对于无符号类型(相当于都是非负数)与有符号类型中的非负数部分,这两种方法没有区别,都是填充0;对于有符号类型中的负数部分,这两种方法就会产生差异了,补零扩展会填充0,而补符号位扩展会填充1。下面将byte类型的-127转为int类型为例,探讨一下这两种方法的区别。

首先必须明确一些知识点:

  • 计算机是用补码来存储数字的;
  • 一个数的补码的补码等于原码。

反码、补码

首先,我们从位权的含义说起。例如,十进制39的各个数位的数值,并不是简单的3和9,这点大家都知道,3表示的是3x10,9表示的是9x1。这里和各个数位的数值相乘的10和1,就是位权。数字的位数不同,位权也不同。第一位(最右边的一位)是10的0次幂,第二位是10的1次幂....以此类推。

位权的思考方式同样适用于二进制。即第一位是2的0次幂,第二位是2的1次幂.... “OO的XX次幂”表示位权,其中,十进制数的情况下OO部分为10,二进制的情况为2,这个则称为基数

在日常生活当中,可以看到很多这样的事情:

  1. 把某物体左转 90 度,和右转 270 度,在不考虑圈数的条件下,最终的效果是相同的;
  2. 把分针倒拨 20 分钟,和正拨 40 分钟,在不考虑时针的条件下,效果也是相同的;
  3. 把数字 87,减去 25,和加上 75,在不考虑百位数的条件下,效果也是相同的;
  4. ……。

上述几组数字,有这样的关系:

  •   90 + 270 = 360
  •   20 + 40 = 60
  •   25 + 75 = 100

式中的 360、60 和 100,就是“”。
式中的 90 和 270、20 和 40,以及 25 和 75,就是一对对“互补”的数字。

知道了“模”,求某个数字的“补数”,就是轻而易举的了:
如果模为 365,数字 120 的补数为:365 - 120 = 245。

用补数代替原数,可把减法转变为加法。出现的进位就是模,此时的进位,就应该忽略不计。

接下来我们正式引入补数:

二进制数中表示负数值时,一般把最高位作为符号位来使用,符号位为0时表示正数,为1时表示负数。

那么-1用八位二进制来表示的话是怎么样的呢?可能很多人认为1的二进制'0000 0001'(常规思维),因此-1的二进制就是‘1000 0001’。但这个答案是错位的,正确答案是‘1111 1111’(计算机补码形式)。(PS:有些教程可能写0000 0001,它可能非计算机八位二进制补码形式,而查用我们数学表达?而下面使用符号位不变取反也是这批人。)

而计算机里面,只有加法器,没有减法器,所有的减法运算,都必须用加法进行。计算机再做减法运算时,实际上内部是在做加法运算,在表示负数时就需要使用“二进制的补数”补数就是用正数来表示负数,很不可思议吧。

为了获得补数,我们需要将二进制的各数位的数值全部取反,然后再将结果加一。例如,用八位二进制表示-1时,只需求得1,也就是0000 0001得补数即可。具体来说,就是将各位数得0取反得到1,1取反成0,然后将取反得结果为1,最后就转化为了1111 1111。

(ps:国内还有一种算法就是符号位不变,balala.. 按照上面钟表的例子,其实也行的通,但是其似乎偏离了设计者得本意与它得本质)

补码的思考方式,虽然直观上不易理解,但逻辑上非常严谨,例如1-1也就是1+(-1)这一运算,我们都知道答案为0。首先,让我们将-1表示为1000 0001(错误方式,原码)来运算,看看结果如何,0000 0001 + 1000 0001 = 1000 0010,很显然结果不是0。

接下来,我们把-1表示为1111 1111 (补码)来进行运算。 0000 0001 + 1111 1111 = 1 0000 0000 。最高位溢出,对于溢出位,计算机回自动忽略掉。在八位这个范围内计算,1 0000 0000 这个 九位二进制会被认为是 0000 0000 这一八位二进制数。

请牢记“将二进制数的值取反后加一的结果,和原来的值相加,结果为零”这一法则。

那么 1111 1110 表示的负数是多少大家知道吗?这时,我们可以利用负负得正的性质,假若1111 1110是负

补码/反码、零扩展和符号位扩展(Zero extension and Sign extension)相关推荐

  1. 零位扩展和符号位扩展

    1.符号扩展:当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1:对于正数而言,符号扩展和零扩展是一 ...

  2. 符号位处理方式 c语言,C语言位域解析符号位扩展规则

    从一个例子说起: int main(void){ union{ int i; struct{ char a : ; char b : ; char c : ; }bits; }num; printf( ...

  3. 在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展

    今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合. ...

  4. java平方符号是什么_Java中符号位扩展

    第一个例子: byte b=-100; b在内存中是以补码的形式存贮的: 1001 1100 如果执行char c=(char)b; 如3楼企鹅先生所说:b要先变为int,这时增加的位全要用b的符号位 ...

  5. 关于整型数据符号位扩展的问题

    关于符号扩展的问题,我们大家读到最多的一句关于符号扩展规律就是"对于无符号整型数据,要扩展成符号位的话,就是将扩展位补零,其他位保持不变.但对于有符号整型数据的符号扩展规律就是:原来符号位为 ...

  6. Verilog功能模块——符号位扩展

    一. 模块功能与应用场景 模块功能:符号位扩展 应用场景:DDR等存储器通常是32/64位的,数据需要转为合适的位数再存入. 二. 模块框图与使用说明 输入和输出都是二进制补码,补码的符号位扩展就是补 ...

  7. 有符号数据的符号位扩展

    简介: 在写传感器驱动程序的时候经常会遇到输出数据位数在8到16位之间.这样,在调试的时候如果使用printf直接输出数据,有可能出现错误.因为printf在打印的时候会做数据类型判断.所以我们需要对 ...

  8. 在补码的运算中为什么符号位可以参与运算?

    目录 一.为什么要引入补码? 二.补码的思想 1. 模的概念 2. 补码的思想 二.补码表示法 1. 补码的定义 2. 由真值和原码转换为补码 三.真值.原码.补码对应图 回答标题中的问题 一.为什么 ...

  9. 计算机组成原理:原码,补码,反码,移码

    无符号数 寄存器的位数反映和决定无符号数的表示范围 比如八位的寄存器就只能储存十进制的0-255 有符号数 机器数与真值 在计算机当中没有硬件表示小数点的位置,而小数点的位置是我们自己约定的, 小数的 ...

最新文章

  1. linux下从git获取有权限的代码,linux下从源代码安装git
  2. go 怎么等待所有的协程完成_Go语言入门必知教程-协程
  3. 用ABAP代码读取S/4HANA生产订单工序明细
  4. 15.17 对缺乏潜在类型机制的补偿
  5. Vue + Spring Boot 项目实战(六):使用 Element 辅助前端开发
  6. JAVA基础系列:ThreadLocal
  7. 如何成为高级测试人?
  8. OSPFv3中LSA详解(二)——Router LSA详解
  9. 文件异步上传方式(二)
  10. 拓端tecdat:R语言KMEANS均值聚类和层次聚类:亚洲国家地区生活幸福质量异同可视化分析和选择最优聚类数
  11. 机器人学导论——操作臂运动学
  12. 滴滴的2019:巨亏和裁员之后,群狼将至
  13. java 数组定义是必须指定长度吗
  14. 一款英国折叠车如何在中国城市流行?
  15. 标志设计错误的10个例子
  16. 拒绝B站邀约,从月薪3k到年薪47W,我的经验值得每一个测试人借鉴
  17. 【模式识别与机器学习】模式识别中的一些基本概念
  18. 中信国健临床通讯  2011年2月第1期
  19. DOM初探(18)——让滚动条滚动
  20. Scrapy爬虫:XPath语法

热门文章

  1. 我们如何获取信息,组织知识
  2. 拉格朗日乘数法 和 KTT条件
  3. 「PyTorch自然语言处理系列」7. 自然语言处理的进阶序列模型
  4. linux网卡驱动内核文件目录,LINUX内核升级更新网卡驱动
  5. 人工智能的落地及未来的发展
  6. OpenCV在win10安装
  7. Unity 个人玩法Demo合集
  8. 基于Android的MJPEG网络摄像机设计
  9. 这届勒索病毒,其实很有上进心呀
  10. 移动流量转赠给好友_手机包月流量用不完:教你如何转赠给好友使用