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

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

为什么补码这么巧妙实现了正负数的加减运算?参见维基百科:
补码
-1的二进制表示

下面结合题主提到的寄存器状态举个例子。
为简化起见,我们8位二进制数来讲。
先看8位二进制与无符号数和有符号数的对应二进制
无符号 有符号
00000000 0 000000001 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

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

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

  1. java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...

  2. 关于有符号数和无符号数

    关于有符号数和无符号数 最近,在讨论有符号数和无符号数在计算机中的表示的问题,结果越讨论越乱.而且使用C语言胡乱验证了一番,最后发现使用了C语言的工具,竟然使得数据真正存储的事实更加令人迷惑.从一个侧 ...

  3. 计算机怎么识别有符号数和无符号数的

    这个问题我在学习汇编语言的过程中一直很苦恼,在网上看了很多帖子,基本上都是说是人自己设定是有符号数还是无符号数的.这样的回答是很扯淡的,TM计算机和人脑又不是一个东西,看来很多人学东西基本上都是一知半 ...

  4. 有符号数与无符号数的加减法

    声明: 本博文源自:http://www.echojb.com/computer/2016/10/06/227097.html 在此感谢博主! 一.有符号数的加减法 1.符号数与无符号数的人为规定性: ...

  5. 有符号数和无符号数的区别

    C语言允许我们定义有符号数和无符号数,例如一个字节的存储空间,我们可以定义成unsigned char,也可以定义成signedchar,但是你知道它们的区别吗?你知道它们是怎样被存储,又怎样被区分处 ...

  6. 关于计算机如何区分有符号数与无符号数

    计算机不能区分两者 无符号数 没有原码,反码,补码等,他的范围是 ≥0 的 有符号数 有原码,反码,补码等,他的范围是随意的 计算机通常用补码来表示有符号数 计算机的一个数据可以看作是有符号数,也可以 ...

  7. 理解有符号数和无符号数的区别

    理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...

  8. c语言中的无符号字节,C语言之有符号数和无符号数

    我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时 ...

  9. 11-有符号数和无符号数

    1. 有符号数和无符号数 无符号数,因为没有符号位,所以只能表示一个正数. 有符号数,因为存在符号位,符号位如果是0的话,代表这是一个正数,符号位如果是1的话,代表这个数是一个负数. 我们可以用db伪 ...

最新文章

  1. 我们离得开美国的软件和硬件吗?
  2. 20145209 2016-2017-2 《Java程序设计》第7周学习总结
  3. 大数据架构师训练营学习笔记
  4. opensips mysql 认证_基于ubuntu中使用mysql实现opensips用户认证的解决方法
  5. HoughLine变换
  6. 去除序号(正则表达式with sublime text)
  7. 复合选择器-focus选择器(HTML、CSS)
  8. 寿光农商行计算机机房,寿光农村商业银行:新系统上线前奏——培训
  9. IT书籍汇总下载(python_c++_java_android_网络安全)等-持续更新
  10. 做游戏代理要找游戏源码平台
  11. 论文浏览(45) MiCT: Mixed 3D/2D Convolutional Tube for Human Action Recognition
  12. 元神一直显示连接服务器失败,原神连接服务器失败怎么办
  13. 模板编程:模板特例化以及特例化inline的做用
  14. socket缓冲区/sk_buffer/滑动窗口关系
  15. 基于车辆模型的横向控制方法
  16. 湿地营救机器人_“湿地卫士”创意机器人,真棒!
  17. 2018全球互联网经济大会,春季峰会在南京开幕
  18. php 分页 页数多,一个php页面多个分页共存
  19. 项目立项和招投标管理
  20. 怎么把pdf转换成ppt格式?

热门文章

  1. P6跨级晋升P8再到P10,我的11年成长之路
  2. phpMyWind本地伪静态设置方法_已迁移
  3. 多核CPU,单核CPU,超线程技术,与多线程程序深入浅出
  4. 专题二 MATLAB矩阵处理
  5. 计算机视觉 python 解图片数独题
  6. 网页通过Flash播放视频
  7. 汉信码生成和识别SDK
  8. html 正方形字符,HTML常用标签以及特殊符号
  9. 零代码组态:搭建智慧水泥生产工艺流程
  10. Android SVG图片解析Demo