文档章节

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

一真的鱼
 一真的鱼
发布于 2017/02/27 21:58
字数 915
阅读 69
收藏 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
武汉
私信 提问
C语言系列(二)有符号数和无符号数详解 (原码/反码/补码)

转自:https://blog.csdn.net/u011974987/article/details/52142794 Test results (64bit build system): 1、你自已决定是否需要有正负: 就像我们必须决定某个量使用整数还是实数,使用多...

fybon
06/20
0
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
数据的机器层次表示

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

sinat_38321889
01/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

etcd集群备份和数据恢复

etcd是一个分布式k-v数据库,在kubernetes中使用其管理集群的元数据。这里介绍etcd集群数据的备份和数据恢复的方法和步骤。 本文来自于:https://www.maideliang.com/index.php/archives/25/...

openthings
3分钟前
0
0
「阿里面试系列」面试加分项,从JVM层面了解线程的启动和停止

文章简介 这一篇主要围绕线程状态控制相关的操作分析线程的原理,比如线程的中断,线程的通信等,内容比较多,可能会分两篇文章 阿里面试系列导读:关注我的技术公众号【架构师修炼宝典】一周...

Java架构资源分享
10分钟前
1
0
centos安装confluence全攻略

https://blog.csdn.net/qwer026/article/details/51439076

happyeveryday32
24分钟前
3
0
30 行 Javascript 代码搞定智能家居系统

本文首发于『阿里云 IoT 开发者社区』,更多精彩物联网内容欢迎前往浏览。 智能家居可谓是今年物联网的热门领域,通过智能单品和智能音箱,人们已然把『智能』两个字变成了生活的理所应当。搭...

阿里云官方博客
27分钟前
4
0
sed插入和附加文本基础使用

对于编辑器来说,在数据中增加行算是很基本的操作吧,sed有以下两个操作: 插入(insert)命令(i)会在指定行前增加一个新行 附加(append)命令(a)会在指定行后增加一个新行 还是用下面的文本来测...

woshixin
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部