首先考虑一个咱们常常看到的词——32位/64位系统。编码
咱们知道,计算机使用二进制数来存储信息,1位就是一个0或1的数字,32位系统指的是该系统的指针采用32位二进制数来表示。指针
指针的做用是指向一个虚拟内存地址(虚拟内存后面会讲,此处可看成内存来理解),也就是说,内存中的每一块都对应一个独有的指针的值。32位二进制能够表示的数的范围是0到2^32 - 1
,也就是0到4294967296,最大值换算一下就是4千兆字节(4GB)。因此说,老的32位系统最大支持的内存就是4GB,再大的话,指针就没法表识,也就没法识别和使用超出4GB的内存区域了。code
对于64位系统是同理的,64位系统的指针长度至关于32位指针长度的32次方,高达16EB!(1EB = 1024PB = 1024*1024TB = 1024*1024*1024GB
)内存
接下来要讨论一个常见问题——单位。数学
1bit(1位)表示二进制数字的1位;1Byte(1字节)表示8位二进制数,它是计算机中表示、传输和操做数据的最小单位。it
注意,1B=1Byte,1b=1bit,计算机中99%的状况下使用的都是Byte字节,bit位能够只把它看成一个数学定义。class
平常生活中不少人认为运营商坑爹,百兆宽带下载速度才十几兆,其实就是通讯领域和计算机领域中采用的数据单位不一样而致使的误解。运营商宣称的网速单位是b/s,而咱们实际在计算机中看到的网速单位是B/s。百兆宽带的100Mb/s除以8,也就是咱们在计算机中看到的网速峰值12.5MB/s。原理
计算机中除字节外,另外一个重要单位就是字长,字长其实在开头第一个问题就讲过了,指明的就是指针数据的标称大小。下载
第三个问题是整数。二进制
计算机中将整数分为无符号数和有符号数,用一个字长来表示,无符号数与有符号数的编码方式不一样,致使数值范围、运算方式和溢出结果都极为不一样。接下来的讲述用w来表识字长,w值为32或64。
先说无符号数,也就是大于等于0的整数,无符号数的表示和运算很直观,与二进制对应: 第 i 位的权重就是2 ^ (i - 1)
,其范围是0 ~ (2^w - 1)
。
当无符号数不足w位须要拓宽时,在数值前面补0,大小不变;
当计算出的无符号数超过w位发生溢出时,其高位会被截断丢弃,结果会减去丢弃的位数与其权重的乘积。例如无符号数1011001,假设w=5,则结果被截断为11001。
有符号数的表示和运算是本章的难点,但搞清楚原理就能够推导出各类结果了。有符号数采用“补码”的编码方式,与无符号数的区别是:
(2 ^ (w - 1))
,而是复数(- 2 ^ (w - 1))
,同时也做为符号位:最高位为1时表示负数,为0时表示正数。(- 2 ^ (w - 1))
;最大值为011…11,即(2^(w-1) - 1)
。搞清楚原码和补码编码之后,就能够由此推导出整数的各类运算以及与有符号数与无符号数之间的转换了,本文再也不赘述,读者能够本身推一推。
最后一个问题是浮点数。
浮点数的表示能够分为三部分,总共32/64位:
最终表示的数值 = ((-1)^s) * (1.m) * (2^e)
这样的编码还有一些盲区:没法表示0~1之间的数;没法表示正负无穷和NaN。因而计算机规定了这些数值的表示方法:
((-1)^s) * (1.m) * (2^e)
;((-1)^s) * (0.m)
;浮点数用于计算时采用“偶舍入”的方法,即“四舍六入,五取偶数”。
“偶摄入”可避免统计误差,由于原数末尾大于或小于一个偶数的几率相等,因此将原数变大或减少的几率是相等的。
理解了浮点运算的编码规则,就能够推出浮点运算的运算律: