庞大的计算机系统本质就是由0和1构成的。计算机内部由数以百万计的器件控制着电路的工作,而电路本身只有两个状态,0无电压,1有电压,为了表示更多的数值状态,我们把多个电路组合并起来使用,这样就有了N条线路表示N个bit位。这样就可以表示2的N次方个不同的状态。计算机的数据类型也是通过这种二进制的方式来表达的。
无符号整数,有符号整数和补码
N个bit位可以表示0~2^N - 1之间的无符号整数,-2^(N-1)~2^(N-1)-1之间的有符号整数。
计算机中存在大量的负数运算,正整数按照正常的表示方式即可,可是负整数要怎么办?
1.用最高位表示正负情况0为正1为负(符号位表示法)
2.将正整数的所有bit位取反,即为该整数的负数表示(反码 1's Complemet)
但是这两种情况均存在硬件的逻辑设计过于复杂的情况,比如两个符号相反的整数相加。
因此 补码(2's Complement)应运而生,目前,几乎所有的计算机都采用这种方式。
补码:正整数的编码表示方式不变,也是最高位为0,其余位表示0~2^(N-1)-1.对非0整数A的码字,取反再加1得到-A
为了保证逻辑电路尽量简单,即给两个输入,ALU(算术逻辑运算单元)只是简单的对两个输入做加法,而不考虑正负情况,而补码正好可以满足这种需要。
补码的性质 A+(-A) = 0;可表示范围内相邻两个数之间的差值为1.
二进制转十进制
AnAn-1.....A2A1A0
1.判断最高位 An为0还是1,为1先转为对应的绝对值相同的正整数码.
转换公式 An-1*2^(n-1) + An-2*2^(n-2) + .... + A1*2^1 + A0*2^0;
如果为负数,求和之后在最前面加上 负号。
十进制转二进制
步骤:第一步 判断N为奇数还是偶数,奇数则A0为1,偶数A0为0;
依次让N=(N/2向下取整),同样的为奇数时对应的位为1,否则为0。直到N为0。
注意,如果为负数的话需要最高位补0获得补码表示。
二进制的算术运算和十进制原理大致相同,都是按位对齐,从右往左,满二进一.
符号扩展(在前方补0或者1,正数补0,负数补1),主要用于两个不同长度的二进制相加时的计算。
注意,如果两数相加的结果超过了可表示范围,最高位会被忽略,意味着发生了溢出。
通过运算结果和两个数之间的符号位比较,可以很容易的发现溢出问题。溢出只会出现在两个相同符号相加的时候。不同符号的两个数相加不会溢出。
逻辑运算(AND OR NOT XOR)
与运算(AND)两个操作数都为1时结果为1,否则为0.
或运算(OR) 两个操作数其中之一为1则结果为1,否则为0.
非运算(NOT)对操作数取反 1为0,0为1.
异或运算(XOR)两个输入值(1和1,0和0)相同则结果为0,否则为1.
其他数据类型
位矢量:存在n个单元,有一个n个bit的二进制数表示。如果某个单元空闲,对应的bit位清0,忙碌则置1.
通过屏蔽字来实现,如要把某位置为空闲,可以用一个其他位为1,对应位为0的屏蔽字做AND操作。
把某位置为忙碌,则可以把屏蔽字其他位置0,对应位置1做OR操作
浮点数
符号位: 1bit, 代表正数还是负数。
数值范围:8bit, 代表范围。指数
数值精度:23bit,代表精度,尾数部分,即小数点后的数
按照我的理解,指数位全0,代表非常小的趋于0的数,而全1表示正负无穷大的数。
还有一个注意点,小数前都是1,所以其实可以表示24位的精度
ASCII码
这是一种用于在计算机处理单元和输入/输出设备之间传递"字符"的编码标准,不同的字符对应了不同的ASCII码(字母的大小写表示的是不同的ASCII码)
十六进制计数法HEX(0~F)
相当于把4个二进制位合成一位,更便于阅读,同时也适合计算机操作。
如 1111 1100 1001 ---- > FC9