文档章节

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

一真的鱼
 一真的鱼
发布于 2017/02/27 21:58
字数 915
阅读 63
收藏 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

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

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

土匪猿
04/12
0
0
一道C++面试题和补码、无符号数减法运算

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

Aspirinrin
2017/11/24
0
0
《深入理解计算机系统》2——信息编码

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

曹越
2012/04/10
0
0
另一个视角解读计算机编码-补码编码

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

长平狐
2012/09/03
28
0
数据的机器层次表示

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

sinat_38321889
01/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微信小程序开发系列六:微信框架API的调用

微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发...

JerryWang_SAP
42分钟前
4
0
5 个用 Python 编写 web 爬虫的方法

大家在读爬虫系列的帖子时常常问我怎样写出不阻塞的爬虫,这很难,但可行。通过实现一些小策略可以让你的网页爬虫活得更久。那么今天我就将和大家讨论这方面的话题。 我刚整理了一套2018最新...

糖宝lsh
43分钟前
6
0
docker安装redis、mongodb、mysql等

一、启动docker服务,设置镜像: systemctl start dockervi /etc/docker/daemon.json{ "registry-mirrors": ["https://registry.docker-cn.com"]} 二、下拉镜像: 在镜像中心h...

狼王黄师傅
今天
5
0
deepin系统使用deepin-wine安装exe程序

deepin自带原生deepin-wine使用命令如下: deepin-wine QQBrowser.exedeepin-wine QQMusicSetup.exe 默认安装的快捷方式位置: /root/.wine/drive_c/'Program Files'/Tencent/QQBrowser/......

临江仙卜算子
今天
4
0
快速get到学习Linux操作系统的点

快速get到学习Linux操作系统的点 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能够运行主要的UNIX工具软件...

linuxCool
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部