源码/反码/补码/BCD码/ascll码自我总结
由于今年专业课开设了《微机原理》和《数据结构》这两门比较重要的课程。再加上最近两天本人正在回头恶补c语言,发现了在c语言中会用各种码制,所以今天呢,本着总结巩固,并自我提高的态度(
其实是顺便完成每周一篇总结性博客的自我目标233
)来对所学习的知识做一个划分联系,希望以后能借此形成自己的知识体系。
二进制与三种码制的关系
二进制
计算机遵循的是冯诺依曼体系,其中特别重要的一点就是釆用2进制计数法。其原因是引文计算机是由逻辑电路组成的,电路中通常只有两个状态,开关的接通和断开,这两种状态正好可用“1”和“0”表示。计算机在表示数的时候,会使用以下两种状态。开关切断状态,开关连通状态。
刚好通过这两种电信号的状态来对事物进行(通过算法进行)“是”和“不是”(既“非”)的准确判断(只存在是/非这两种判断)
。
以“1“为真(是)以“0”为假(非
)。刚好对应二进制只存在0和1这两个数的 特征
源码
众所周知 c语言中存在有符号数和无符号数这两种类型的数据。
有符号数;字最高位为符号位,可以表示的有效数字相比无符号数来说少了这一个符号位就少了2倍(
这个说法可能不准确,这是我个人认为的,如有错误希望能指出
)其中,正数的最高位符号位为0,负数的最高位符号位为1。
无符号数; 整个字的所有符号都可以用来表示数,最高位不是符号位,但是只能表示正数0-255 2^8=256 256个数即为从0-255
举例;以32位操作系统下的int为例
有符号数;-123的二进制数源码为 1000 0000 0000 0111 1011
无符号数;123的二进制数源码为 0000 0000 0000 0111 1011
反码
有符号数最高位为符号位,无符号数没有符号位。 反码即为将该数的二进制码,除开符号位以外,其余各位依次按位取反。反码会造成+0/-0问题,这一点会在补码中进行解决(+0;00000000
-0;10000000 这两个数都表示0)
例如
-123 反码 1111 1111 1111 1000 01 00 123反码 1111 1111 1111 1000 0100
源码 1000 0000 0000 0111 1011 123源码 0000 0000 0000 0111 1011
补码
计算机内进行数值运算时,都是按照二进制的补码形式计算的。原因在于
-
可加法代替减法运算,[a-b]补 = [a]补+[-b]补
简体了计算机运算硬件电路,提高运算效率: -
统一了正0和负0
原码及反码的正0、负0有不同的表示,补码的0是唯一的,
例如字长8位,
补码的0表示为唯一的00000000
。这时10000000这个数就是多余的,我们将其规定为-128!
暨-128的补码是10000000
模的概念可以帮助理解补数和补码。
以钟表为例子
钟表能表示的最大数位11时59分59秒。当该时间+1s时,我们在个体认知上是主观将其人为是1点的。同时,由于世界采用24小时制。我们习惯将最大数认为是23h59m59s
但是钟表上表盘的客观划分是在11.59.59+1s过后归零。这一点与二进制数进位然后该位归零是相同的道理。以此类推,8进制的摸是八最大数是7,16进制的摸是16,最大数是15等等
以钟表为例子。
例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:
一种是倒拨4小时,即:10-4=6;
另一种是顺拨8小时:10+8=12+6=6
我们会发现这两种拨发的最后结果是相同的,最后指针都在6处。以此拓展,
因此凡是减法运算,都可以用加法来代替。暨要减去一个数,可以该数该数和他所对应的摸得差。例如八进制下 7-5=7+(8-5)=7+3=8+2=2
补码,源码,反码转换
(
我被老师说这么多年写字难看是有原因的
)
变补是将所有位全部取反(有符号位的话包括符号位)然后载+1
(上图变补少写了+1)
ASCll码
ascll本质是一种映射表 ascll码表有0-255个
其中0-127为基础表128-255位扩展表
ascii(american standard code for information interchange,美国信息互换标准代码)
是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0)。例如,象a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示。而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,
于是美国有关的标准化组织就出台了所谓的ascii编码,
统一规定了上述常用符号用哪些二进制数来表示
。
BCD码
BCD码(Binary-Coded Decimal)亦称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。(摘自搜狗百科)
BCD码主要分为8421 5421 2421三种码制。BCD码只能用4位2进制数字表示0-9,暨0000-1001.但是已知4位二进制数字能表示0-15这16个数。所以在讲二进制码以每四位数字分组后每一组表示一个数字,数字的先后顺序代表10进制中的权重大小。其中最主要的一个问题就是,当4位二进制数表示的数字大于9时如何显示!。因为BCD码只能表示到9,二进制码最大只能表示到15.所以当4位二进制码大于9时,我们需要对其加0110(对应的十进制为6)使其进位。
(关于bcd码这一点过段时间我会再进行多次手动计算,希望过两天我能附上我的计算过程。)