有符号数的加减法 和无符号数的加减法,和,系统是如何识别有符号数和无符号数的
一.有符号数的加减法
机器不知道你进行的运算是否有符号,如果你进行的是有符号运算,你需要查看OF,否则不需要。
所以,溢出不溢出,是由程序员判断的,机器不知道。
比如0111+1101,你说它是无符号数7+13呢,还是有符号数7-3呢?
对微机而言这是一回事!
(1)CPU只会根据输入信号进行逻辑运算,在硬件级别是没有有符号无符号的概念,运算结束会根据运算前的信号和输出信号来设置一些标志位,是不是有符号由写程序的人决定,标志位要看你把操作数当有符号还是无符号来选择,就像内存中的数据,你可以按照需要来解析,原始数据在那里,你要按什么数据格式来解析在于自己的选择;
注意:在汇编语言层面,声明变量的时候,没有 signed 和 unsignde 之分。汇编器统统将你输入的整数字面量当作有符号数处理成补码存入到计算机中;
(2)
计算机对有符号整数的表示只 采取一套编码方式,不存在正数用原码,负数用补码这用两套编码之说,大多数计算机内部的有符号整数都是用补码,就是说无论正负,这个计算机内部只用补码来 编码!只不过正数和0的补码跟他原码在形式上相同,负数的补码在形式上与其绝对值的原码取反加一相同。
(3)
有符号数和无符号数在计算机里表示都是一样的,二进制的补码形式。
是有符号还是无符号,是编译器来辨认的。
例如:
unsigned char uch, char ch;
在内存中有个数1111 1111. (内存中的数 都是补码)
把它赋给uch(无符号数),那么uch就是255
如果赋给ch(有符号数),那么ch就是-1 (计算过程:先看符号位 最高位 1,所以确定ch是一个负数。内存里放的数据是负数ch的补码1111 1111。现在求这个负数ch。就是对补码1111 1111的逆运算,因为补码1111 1111 由负数ch的反码加1得到的,所以ch的反码为补码符号位不变且减一,ch反码为1111 1110,ch等于ch反码的反码,所以ch等于1000 0001,即-1。或者ch等于ch补码的补码,即1111 1111的补码,即1111 1111反码加1,即1000 0000 加1,即1000 0001,即-1)
——————
有无符号的整数,在计算机内存中是区别不出有无符号的,而是在程序里有区分。
有符号数时,计算机存储器中存放中的数据(数)就是补码形式。(题目中的数值省略掉的描述也指的是存储器中的数值。意思是模拟CPU的读入和输出出的题目,不是针对外部输入输出设备;另外这里存储器中的二进制码 默认指的是数,含义可能是 参与计算的有符号数或者代表地址的无符号数,不是指令())
有符号数可以存储正负数,无符号数只能存储非负数(0或正数)。
但是,有符号数因为需要安排一个位置来表达数值符号,因此它能表示的绝对值比就要比无符号数少一半。
无符号整数常用于表示地址、索引等正整数,它们可以是8位、16位、32位、64位甚至更多。
---------------------------
《微机原理与接口技术》中写道:“在微机中,对于定点数存在无符号数和有符号数的概念。无符号数表达的是 大于等于0的数,在机器表示时不需要表示符号的信息。...。在计算机中,常用8位,16位, 32位,64位等字节整数倍的位数进行定点数的表示。”也就是说,《计算机组成原理》中的5位 7位等的数,实际上是没有意义的,当时只是为了理解一些运算概念才出的那些题。
《微机原理与接口技术》中写道 :“时钟一圈是12个小时,顺时针+1,逆时-1,这样,在时钟上-1和+11是一样的。”类似,用8位来表示有符号数,它的一周是2^8=256,所以-1就可以用255(2^8-1)来表示,这就是补码的含义。//原码-1 补码255
再次强调:微机中有符号数的机器表示(即实际存储字符串)是补码。
cpu中就可以用加法器直接实现减法,而不再需要再专门设置实现补码减法的部件了。
微机原理中,存储器(包括内存)中存放的数据(二进制码)都是补码(有符号数时。无符号数时就是个非负数(实际含义可能是地址 也可能是指令 也可能是ASCII码,必须结合其用途才能知道其具体意义))。
注意数据来源:用户输入的数据不等同于微机运算器读入的数据。
课本中的题目 意思是学会最基础的加减运算,因为加减运算是微机运算的基础,乘除法本质是加减运算。乘法是相同因数加法的简便运算。
微机原理和计算机组成原理中的加减运算不一样!后者包含前者。因为是计算机组成原理,所以包括了很多硬件系统和软件系统,而微机原理课本中出的题目狭义的指微机计算机的加减运算。(先搞清楚计算机的语言执行逻辑(见下文第3条),数据处理流程(见下文第5条),微机系统与运算器的关系(见下文微机),会更容易理解。)
公式总结:
无符号数时没有符号位,就是一个非负数值,因此也没有原反补的说法。有符号数时有符号位,原反补码才有意义。
有符号数时:
补码的表示方式是人脑无法看出其数值的,必须转换成原码再计算其数值。
补码的补码是原码。补码的逆运算是原码。
反码的反码是原码。反码的逆运算是原码。
反码: 正数的反码 = 原码。 负数时,反码 = 补码 - 1;反码 = 符号位不变,其余位求反(位求反)。
补码:正数的补码 = 原码。负数时,补码 = 反码 + 1,即符号位不变 其余位求反 再加1。(即求补操作只有负数才有)
“求反加1”操作称为求补操作,又称为算数求反。
实例来咯:
假如编了一个循环减法的代码(使用的某种高级语言),int m=10, 逐次减1,循环5次后输出结果,那么过程怎么进行的呢?
这个涉及到编译原理。这个源代码经过编译器编译,按照设定的语法规则等对词法语法语义等分析,以及转化中间产物 可能是其它语言,最后转化为计算机通用语言。
例如:一个.c文件,编译过程:(正如下文3-(3)高级语言编译流程图所示)
.c文件到.i文件,这个过程叫预处理 //处理“#”的过程
.i文件到.s文件,这个过程叫编译 //词法语法语义分析、源代码优化、代码生成、目标代码优化,生成相应的汇编代码(可打开看)
.s文件到.o文件,这个过程叫汇编 //将源文件翻译成二进制文件(机器可执行的指令。由于是机器码,不能以纯文本打开)
.o文件到可执行文件,这个过程叫链接 //二进制文件尚无法单独执行,需要与用到的库绑定等,生成可执行程序
到了计算机底层,数据开始运算:位运算。开始逻辑实现:若干逻辑运算(与或非异或移位运算),加法器。
电信号通过二极管控制电流输出表示不同的状态值。
---
微机:(理解微机原理这门课的知识范畴)
微型机、微电脑、微型计算机的简称。由大规模集成电路组成的,体积较小的电子计算机。俗称电脑。
微型计算机,以微型处理器(CPU)为基础,配以内存储器及输入输出(I/O)接口电路和相应的辅助电路而构成的裸机。简单定义为:在微型计算机硬件系统的基础上配置必要的外部设备和软件构成的实体。
微型计算机系统,从全局到局部存在三个层次:微型计算机系统,微型计算机,微处理器(CPU)。单纯的微处理器和单纯的微型计算机都不能独立工作,只有微型计算机才是完整的信息处理系统,具有实用意义。
微机计算机系统 = 硬件系统 + 软件系统
硬件系统 = 运算器 + 控制器 + 存储器 (含内存、外存、缓存)+ 各种输入输出设备 。采用“指令驱动”方式工作。
软件系统 = 系统软件 + 应用软件 。
系统软件,指管理、监控和维护计算机资源(包括硬件和软件)的软件。主要包括:操作系统、数据库管理系统、各种语言处理系统、以及各种工具软件等。其中操作系统是软件的核心,用户只有通过操作系统才能完成对计算机的 各种操作。
应用软件,是为了某些应用目的而编制的计算机程序。包括:文字处理软件,图形图像处理软件,网络通信软件,财务管理软件,CAD软件,各种程序包。
第一代微型计算机:1981年美国IBM公司推出的第一代微型计算机IBM-PC。
微型计算机发展:从单纯的计算工具发展成为能够处理数字、符号、文字、语言、图形、图像、音频、视频等多种信息的强大多媒体工具。
分类:工作站;服务器;工业控制计算机;个人计算机;嵌入式计算机;
工作站:面向专业领域的高档计算机,强大的数据运算与图形处理能力以及互联网功能。满足工程设计、动画制作、科学研究、软件开发、金融管理、信息服务、模拟仿真等专业领域而设计开发的高性能计算机。一般拥有较大的屏幕显示器和大容量的内存和硬盘。
服务器:网络的节点,稳定性、安全性、可管理性要求更高。针对具体的网络特别定制,高速运算能力、长时间的可靠运行、强大的外部数据吞吐能力。服务器主要有网络服务器(DNS、DHCP)、打印服务器、终端服务器、磁盘服务器、邮件服务器、文件服务器等、
工业控制计算机:采用总线结构,对机电设备进行监测与控制的计算机系统,简称控制机。
个人计算机:台式机(通风散热性好);笔记本;PDA;平板。
嵌入式计算机:即嵌入式系统,以应用为中心以微处理器为基础,软硬件可裁剪的 专用计算机系统。几乎包括了生活中的所有电器设备,如计算机 机顶盒 手机 数字电视 多媒体播放器 汽车 微波炉 数字相机 电梯 空调 安全系统 自动售货机 消费电子设备 工业自动化仪表与医疗仪器等。
(原来这些都叫微型计算机。。那还有不微型的吗??有啊,就是不满足微机基本组成结构(计算机主机及其外部设备)的东西,比如一个软件一个程序这种残缺不全的东西)
---
建议自行补充了解以下内容,可以更好的了解补码运算在计算机内的运算处理过程是怎么回事:
1,数据的字长问题。
字长:一个字的长度(位数)。表示同一时间处理二进制数的位数(存储、传送或操作时),是CPU的主要技术指标之一。现代计算机的字长通常为16(早期)、32、64位(现在),字长总是8的倍,即n字节。其它使用过的字长有:8(早期)、9、12、18、24、36、39、40、48、60位。
数据(指令或数)的单位:字或字节。在计算机的运算器、控制器中,通常都是以字为单位传送的。
字的单位:字节; 字的长度(位数):比特。
字节:通常用字节表示存储器中的存储容量。
字长直接反映了计算机的计算精度。PC机的一次操作能处理的最大数字由PC机的字长确定,例如,一台16位字长的PC,可以直接处理2的16次方(65536)之内的数字。
字长越大计算机处理数据的速度越快。16位字长的PC,对于超出65536的数字就需要分解的方法来处理,操作的次数增加 速度就慢,32位字长的PC机能直接处理的数字高达40亿(2的32次方),操作的次数大大减少,从而系统效率提高了。
现在市面上的计算机处理器绝大部分已达到64位。但是大多都以32位运行,没有展示它的字长优越性,因为它必须与64位软件(比如64位的操作系统等)相辅相成,受软件系统的控制,例如,在32位软件系统中64位字长的CPU只能当32位用。
字长由微处理器对外数据通路的数据总线条数决定。所以字长也直接决定着机器的硬件规模以及硬件造价。为了适应不同的精度要求和硬件造价间的关系,所以大多数计算机均支持变字长运算,机内可实现半字长 单字长 双倍字长运算。
字,按地址存储。按照字的存储位置的长度(位数)是否固定,字长又分为固定字长和可变字长。可变字长存储效率更高,固定字长可能浪费空间。
Intel8086微处理器字长16位,其数据总线宽度也是16位。地址总线为20位。
X86:指Intel从16位微处理器8086开始的整个CPU芯片系列。主要有8086、8088(16位CPU)、80186、80286(这两个是过渡产品)、80386、80486、以及以后各种型号的Pentium芯片(32位CPU),系列中的每种型号都与以前的型号兼容。通常所说的x86指32位CPU的。
第一个32位的x86处理器 是intel 80386, 简称 i386。用了20多年。之后的486(80486,i846)、586(80586,Pentium(奔腾),P5)、686(80686,Pentium Pro,P6)都与i386兼容。
2,AMD64 位技术
AMD64位技术,也叫x86-64技术,是基于原Intel32位x86指令集的64位指令集。将原Intel的32位x86指令集扩充到了 64位x86指令集,增加了64位CPU寻址技术。兼容32位x86软件并且支持64位运算。使得芯片真正成为了64位的x86芯片。(AMD的64位处理器产品线先进入市场,但微软不愿意为Intel和AMD开发两套不同的64位操作系统,所以Intel被迫采纳AMD64指令集并增加某些新的扩充到了自己的产品,命名为EM64T架构。)
x86-64技术属于AMD公司的。x86和EM64T技术属于Intel的。其中EM64T技术和x86-64技术异曲同工。
吃瓜时间:
微软是最大的软件制造商(生产操作系统 办公软件 数据库 游戏 等,和CPU生产商没有竞争关系。操作系统垄断者)。Intel和AMD两家都生产CPU(中央处理器),Intel是老大(生产奔腾 酷睿 赛扬。类似CPU垄断者),AMD是老二(生产闪龙 速龙 弈龙),两者是竞争关系。微软只要一换操作系统,那么世界上几乎所有软件公司都要跟着更新,保持兼容,否则没法活;Intel只要一出新的CPU,那么世界上几乎所有的硬件公司都要推出新的技术来支持Intel的CPU,否则会被淘汰掉。(不过以前,微软 Intel AMD都是小公司,微软是给IBM装系统的打工仔,IBM的CPU采用的第三方外包,外包给了Intel,但Intel的8086处理器产量低,Intel只好被迫开放允许第二家芯片处理厂商加入,以保证对IBM的处理器供给,所以把技术无偿给了AMD,开始联手生产8086处理器,AMD沦为Intel的代工厂,也正是这个原因 AMD挖到了第一桶金。再以前,Intel和AMD是一家公司,叫仙童半导体公司,后来从这家公司流失出来的员工,一拨创办了Intel,另一拨创办了AMD,两家公司成立仅相隔一年,但Intel是技术流派,AMD则以销售主导在初期笼络了不少投资商青睐。后来两家公司的产品怎么竞相推出的自行了解~,直到2009年,AMD开始把业务重心放在GPU上,在CPU上不与Intel正面竞争。)
3,语言与二进制运算问题
计算机的不同结构层级上使用的不同语言:机器语言;汇编语言;高级语言。
(1)最低级(最底层)的语言:机器语言。计算机能直接识别的二进制代码。不需要编译,直接被机器执行。目前机器语言使用很弱,除了机器厂家几乎不应用于其它。(计算机只认识二进制。这里的二进制的0和1,不是数字0和1,而是电路逻辑的0和1两个电平状态。0低电平 1高电平。在底层,计算机由无数个逻辑电路组成,根据01数据串和组合来运算;同样,存储在计算机内的所有数据和文件也都是01字符串(以01组成的编码)存储的。)
(2)汇编语言:也是低级语言。一百多条操作指令组成。
汇编语言的二进制码运算:与、或、非、异或、位运算。没有原码反码补码,也没有进位异位问题。
(3)高级语言:在低级语言基础上进行的指令优化。
高级语言直接写成的程序,叫“源代码”,计算机不能直接执行,需要编译器编译成“目的语言”(机器语言)才能被计算机执行。
编译过程:源程序 --> 预处理器 --> 编译 ----(汇编程序)----> 汇编 --> 链接 --> 可执行文件(一串01组成的数据串。机器语言,)
进制问题:
二进制:人为规定的。为了表达01电平。
十进制:与二进制转换复杂。人类采用十进制,可能和人类有十个手指有关。有一个成语叫“屈指可数”,可见古代人算数确实离不开手指,因此使用十进制是极其自然的事情。
实际上古代世界独立开发的有文字的记数体系中,除了古巴比伦文字的楔形文字为60进制,玛雅数字为20进制外,几乎全部为十进制。在商代时,中国已采用十进位制,从已发现的商代陶文和甲骨文中可以看到,当时已经能够用一二三四五六七八九十百千万等记录十万以内的任何自然数。大约春秋战国时代,我国出现了严格的十进制。到15世纪中叶,珠算成为主要的计算工具。
十进制计数法,是古代世界中最先进科学的计数法,对世界科学和文化的发展有着不可估量的作用。正如著名英国史学家李约瑟教授所说:“如果没有这种十进制,就不可能出现我们现在这个统一化的世界了”。李约瑟还说:“总的来说,商代的数字系统比同一时间的古巴比伦和古埃及更为先进更为科学。”
古埃及倒是很早使用十进制,但是他们不知道位值制,位值制就是一个数码表示什么数,看它的位置而定。零是位值制的精要所在。但它的出现并非易事。我国是最早使用十进制的国家,我们的口语或文字表达的数字也遵循这一守则,比如一百二十七。同时我们对0的认识也很早。
古巴比伦的计数法虽有位置值的意义,但是它采用的六十进位计算非常繁琐。
古埃及的数字从一到十只有两个数字符号,从一百到一千万有四个数字符号,而且符号都是象形的。如用一只鸟表示十万。
古希由于几何发达而轻视计算,计数方法落后,是用全部希腊字母来表示的一 到一万数字,字母不够就加符号等方法来补充。
古罗马采用的累积法,如用ccc来表示300。
印度古代既有用字母表示,也有用累积法,到公元七世纪采用的十进制,很可能是受中国影响。
现通用的印度-阿拉伯数码和计数法,大约在十世纪时才传到欧洲。
十六进制:减少二进制的书写冗长 易错 难记问题,作为二进制的缩写。
4,文字编码方式:ASCII码(美国标准信息交换码),和其它文字编码标准GB18030、GBK、Unicode等。
ASCII码是西文通用编码方案(七位二进制编码)。GB2312、GBK、GB18030是汉字字符编码方案国家标准。Unicode、ISO/IEC 10646是全球字符编码国际标准。这些文字编码方案之间是兼容和扩展编码的关系,GB2312兼容ASCII码并且使用双字节编码(因为汉字字符比西文字符多太多),GBK向下兼容GB。
ASCII码:ASCII使用指定的7位组合表示128种可能字符。微机中存储单位为8位,表达ASCII时,最高位通常为0;通信时,最高位(b7)通常用做奇偶校验位,使用后7位二进制数组合来表示所有的大小写字母、数字0-9、标点符号、以及在美式英语中使用的特殊控制字符(其中回车是使光标换到本行首位,换行是使光标进入下一行但是列位置不变)。
(了解ASCII码表的大小规则及ASCII数值含义,以及使用。)
5,计算机处理数据的大致流程。比如:
存储(输入设备把原始数据读入并用存储器存储起来)-->
提取阶段(从存储器或缓冲存储器中提取指令)-->
解码阶段(CPU根据CPU指令集架构(ISA)将数值解释为指令,其中一部分指令为运算码)-->
执行阶段(由控制器把需要处理的数据连接到所需运算的各种CPU部件,比如运算器算术逻辑单元ALU,内含电路系统,有输入有输出) -->
最终阶段 写回(由输出设备把最后运算结果按照一定格式输出,不同的指令的写回结果过程需要操作的相关部件不同)