文档章节

有符号数和无符号数在计算机中怎么区分?

一真的鱼
 一真的鱼
发布于 2017/02/27 21:58
字数 915
阅读 56
收藏 0
点赞 0
评论 0

有符号数和无符号数在计算机中怎么区分?

计算机里面有符号数和无符号数字表示都是一样的,并且对于加法或者减法这些通用的操作都于两类数字都是一样的,并且intel32的处理器里面还有一个EFLAGS标志寄存器里面有两个标志符CF用来表示无符号计算的溢出,OF用来表示有符号数的溢出。那么到底通过什么来表示一个操作是有符号的还是无符号的?

作者:匿名用户
链接:https://www.zhihu.com/question/22132187/answer/20401461
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

确如题主所说,计算机中存储的任何数据都是二进制形式,单看数据是无法认定其格式和内容的。

计算机要用二进制编码来表达数值的符号,最直观的方法就是符号位。但为了保证基本算术运算在正负数上的一致性,x86计算机对负数采用了特殊的编码方式,即补码。

为什么补码这么巧妙实现了正负数的加减运算?参见维基百科:
http://zh.wikipedia.org/wiki/%E4%BA%8C%E8%A3%9C%E6%95%B8#.E4.BA.8C.E8.A1.A5.E6.95.B0.E7.9A.84.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86

下面结合题主提到的寄存器状态举个例子。为简化起见,我们8位二进制数来讲。

先看8位二进制与无符号数和有符号数的对应
二进制 无符号 有符号
00000000 0 0
00000001 1 1
...
01111110 126 126
01111111 127 127
10000000 128 -128
10000001 129 -127
...
11111110 254 -2
11111111 255 -1

按照上述对应关系,我们可以把二进制运算解释为有符号或无符号的十进制运算。

只有算术运算才会有正负号问题,而算术运算中最主要的就是加法系列指令和减法系列指令。范围内的运算咱们不关心,主要看看超出范围的运算如何处理。

当运算超出范围后,CPU会改变标志寄存器中的值(置1),来表示当前的运算结果。算术运算主要用到的标志位如下。
OV(溢出):运算结果超过数值表达范围(比如8位数运算超过256);
ZR(零):运算结果为0时;
PL(符号):运算结果的最高位为1。
AC(辅助进位):低4位是否向高4位进/借位;
CY(进位):高位进/借位;

1. 当加法系指令的二进制结果大于11111111时会产生溢出,结果保留超过11111111的部分,并置溢出位为1。

例如加法add指令:
11111110+00000011=100000001=>00000001
标志位:
由于低4位和高4位都进位了,所以AC和CY置1
对应的无符号运算:
254+3=1
对应的有符号运算:
-2+3=1

2. 减法系的指令会产生“减不过”的情况。减不过时cpu会给左数的最高位添加一个1,使得比右数大,再做减法并置溢出。

例如减法sub指令:
00000010-00000011=>100000010-00000011=11111111
标志位:
由于低4位和高4位都借位了,所以AC和CY置1,由于运算结果高位为1,PL置1
对应的无符号运算:
2-3=255
对应的有符号运算:
2-3=-1

其他的算术运算较复杂,但都可以用类似的方法分析。因超出问题范围,此处不再赘述。

本文转载自:https://www.zhihu.com/question/22132187/answer/20401461

共有 人打赏支持
一真的鱼
粉丝 1
博文 38
码字总数 21290
作品 0
武汉
汇编中的有符号-无符号-溢出-进位

什么是有符号数?什么是无符号数?什么是溢出(OF)?什么是进位(CF)?如何区分有无符号 呢? 有符号数,就是带符号的数,可以是正数或负数。区分正数或负数时,看这个数的最高位是 否为 1,最高位为...

土匪猿 ⋅ 04/12 ⋅ 0

一道C++面试题和补码、无符号数减法运算

面试题在文章第4节。在看面试题之前,可以先看一下1-3节的知识点。 1. 补码 Two's Complement(二补数、补码)是对的数学运算,运算过程为:对二进制序列每一位取反(0->1; 1->0),再加1。 ...

Aspirinrin ⋅ 2017/11/24 ⋅ 0

《深入理解计算机系统》2——信息编码

计算机中数字的主要表示方式有无符号数,补码数和浮点数三种。计算机中最小可寻址单位为8位的块,或者称为字节。机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器,虚拟存储器中...

曹越 ⋅ 2012/04/10 ⋅ 0

另一个视角解读计算机编码-补码编码

数学是一个完全抽象的学科,而计算机是这个学科的一种形象化的实现,显然无法处理一些仅在抽象意义上有意义的特殊“数字”,比如无穷之类的东西,。像数学中的加法,乘法这样运算,计算机必须...

长平狐 ⋅ 2012/09/03 ⋅ 0

另一个视角解读计算机编码-补码编码

数学是一个完全抽象的学科,而计算机是这个学科的一种形象化的实现,显然无法处理一些仅在抽象意义上有意义的特殊“数字”,比如无穷之类的东西,。像数学中的加法,乘法这样运算,计算机必须...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

数据的机器层次表示

数据是计算机处理和加工的基本单位和对象。在计算机中数据分为无符号数(绝对值)和有符号数(真值)。其中带符号数根据编码分为原码、反码、补码、移码。 计算机中数据的表示最基本的为二进...

sinat_38321889 ⋅ 01/24 ⋅ 0

Java 基本类型与二进制数位的本质

1.Java中的基本类型以二进制补码的形式表示,最高位为符号位: 如12, 用二进制表示为:0000 1100 而-125, 用二进制表示为:1000 0011 另补充原码,反码,补码的含义:  原码:将一个整数,...

linsea ⋅ 2013/11/18 ⋅ 0

有符号数和无符号数

数据类型的最高位用于标识数据的符号 最高位为1,表明这个数为负数 最高位为0,表明这个数为正数 在计算机内部,用补码表示有符号数 ----正数的补码为正数本身 ----负数的补码为改数的绝对值...

ElleryQueen ⋅ 2017/11/19 ⋅ 0

补基础:自学:计算机科学导论 第三章 数据存储

3.1 数据类型 数字 文字 音频 图像 视频 计算机内部的数据 所有计算机外部的数据类型的数据都采用统一的数据表示法转换后存入计算机中,当数据从计算机输出时再还原回来。这种通用的格式称为...

soulpei ⋅ 2017/05/26 ⋅ 0

反汇编学习笔记3 - 状态寄存器

状态寄存器    CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同).这种寄存器在ARM中,被称为状态寄存器就是CPSR(current program status register)寄存器 CP...

sqatm ⋅ 04/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 21分钟前 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 29分钟前 ⋅ 0

springcloud+jps+mybatis多数据库配置

多数据库配置 配置我们目录结构设置: config ---datasource ----jpa ----mybatis ----redis Datasource中是数据的相关配置 Jap中是springDatajpa的相关配置 Mybatis中是mybatis的相关配置 ...

大-智-若-愚 ⋅ 37分钟前 ⋅ 0

Spring mvc HandlerMapping 实现机制

概述 当DispatcherServlet接受到客户端的请求后,SpringMVC 通过 HandlerMapping 找到请求的Controller。 HandlerMapping 在这里起到路由的作用,负责找到请求的Controller。 Spring MVC 默认...

轨迹_ ⋅ 40分钟前 ⋅ 0

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部