预备知识
1K = 2^10 = 1024(kiio)
1M = 1024K = 2^20(Mega)
1G = 1024M = 2^30(Giga)
1T = 1024G = 2 ^40(Tera)
1P = 1024T = 2^50(Peta)
1个二进制位:bit (比特)
8个二进制位:Byte (字节) 1Byte = 8 bit
2个字节: Word(字)
1 Word = 2Byte = 16bit
机器字(machine word)长
一般指计算机进行一次整数运算所能处理的二进制
数据的位数
通常也包括数据地址长度
32位字长
地址的表示空间是4G(一次可以处理32位二进制,即2^32 = 4G)
64位字长
地址的表示空间约是1.8*10^19bytes
机器字在内存中的组织
32机型内存即0到2^31线性展开不能完全访问,
访问内存的最小单元是byte,内存地址的编排也是以byte位单位
32位 第一个地址0000第二个地址0004依次
64位第一个地址0000第二个地址0008依次
字节序
大端:Big, Endian
小端:Little Endian
X086为小段排布
long与指针32位为32位,64位为64位其余都一样
计算机整数的编码方式(w表示字长)
无符号数只表示大小,只为正,例如 w = 8
1 0 0 1 1 1 0 1 即 2^7 + 2 ^4 + 2^3 + 2^2 + 2^0
带符号数用补码表示可正可负,补码在机器层面还是0,1串,和无符号数没有区别
最高位表示符号位,这个符号位不是仅仅表示正还是负,它的符号位是乘与相关的二进制权重。
例如 w = 8
1 0 0 1 1 1 0 1 即1 * -2^7 + 2^4 + 2^3 + 2^2 + 2^0
0 0 0 1 1 1 0 1 即 0 * -2^7 + 2^4 + 2 ^3 + 2^2 + 2^0
符号位带二进制权重
带符号数的补码表示,要知道负数的补码,找到对应的正数然后将整数的二进制码按位取反在+1
即可以得到负数的补码
取值范围
假设w = 8
无符号数
最小值 0000 0000 为0
最大值 1111 1111 为2^w - 1
有符号数
最小值 1000 0000为-2^(w - 1)
最大值 0111 1111为2^(w - 1) -1
有符号数的表示负数比整数多1
无符号数与有符号数转换(在硬件表示的层面来开有符号数与无符号数二进制码一样只是解释不同,比如在c语言层面,如果解释为带符号的就按照补码来算,如果解释为不带符号的就按照源码来算)
两个整数相加溢出会变成负数
两个负数相加溢出会变成正数
15213/2 精确值因该是7606.5
右移一位为7606与C语言除法一致
逻辑右移高位补零
算术右移如果为正数高位补0,如果为负数高位补1
如果带符号数大于0与无符号数一直
如果小于0会有舍入错误
如-15213/2精确值为-7606.5
而右移后为-7607与C语言除法-7606不一致
需要做一个矫正2^k -1, (x + 2^k -1)/2K
如果一个数第K位后全是0,包括第K位,那么加上2^k -1 相当于加全1,右移k位后值不变。
如果一个数第K位后含有1,那么就有可能发生进位集第K+1位加1,那么右移K位后,就相当于给右移后+1,则除法正确。
比如-15213右移后为-7607然后+1,为-7606则正确。
从小到大排布,且符合无符号数的比较
越靠近数轴越密
如果不是.5则采用4舍5入,如果是.5则采用向最接近值的舍入
011 < 100 小于.5所以舍
110 > 100 大于.5所以进
100 = 100 等于.5最低有效位不为0所以进
100 = 100等于.5最低有效位为0所以舍。
实例将8位无符号数转化为8位浮点数
8位数据太小,会有误差将整数转换为小数在转换会整数,存在误差