《深入理解计算机系统》读书笔记(二)不同数据类型的表示和计算

计算机的字长决定了虚拟地址空间的最大大小,对于一个字长为n位的机器而言,虚拟地址的范围则为0~2^{n}-1,程序最多可访问2^{n}个字节(每个字节对应一个地址)

为了避免由于依赖“典型”大小和不用编译器设置带来的差错,增强程序的可移植性,ISO C99引入了一类数据大小固定的数据类型,例如int32_t和int64_t

数据在内存的存储方式

大端方式:高位存储在低地址,低位存储在高地址

小端方式:低位存储在低地址,高位存储在高地址

文本数据在使用ASCII码的任何系统得到的结果都相同,与字节顺序和大小规则无关,因此具有更强的平台独立性

位向量

   可以很好地用于表示有限集合,主要用于集合编码,位向量[a_{w-1},..,a_{1},a_{0}]

例:位向量 a = [01101001] 可以表示集合 A = {0,3,5,6}   即第几位为1则表示哪个数字是有效(存在)的

移位运算

左移  ——  01100011  <<4   00110000

逻辑右移    10010101  >>4   00001001

算术右移    10010101  >>4   11111001

整数表示

1、无符号整数

unsigned 整数的和
   
如果两个数均用w位二进制表示

          当x+y<2^{w}时,其和为x+y

          当x+y\geq 2^{w}时,其和则为 x+y-2^{w}

实际在程序中判定时,可通过x+y <x 或 x+y <y判定结果已经溢出

unsigned 整数的求反

    对于无符号整数x,其求反得2^{w}-x

2、补码编码

   B2T(Binary to Two's-complement),最高位为符号位

反码(One's Complement)、原码(Sign-Magitude)

补码加法中的溢出

     正溢出:两个负数相加得到一个正数

     负溢出:两个正数相加得到一个负数

数字的位扩展与截断

小数的二进制表示

  1010.110  ——  1*2^{3}+0*2^{2}+1*2^{1}+0*2^{0}+1*2^{-1}+1*2^{-2}+0*2^{-3}

IEEE浮点表示

V = (-1)^{s} * M *2 ^{E}

S  决定数据是正数还是负数,单独的s符号位直接编码

M  尾数M是一个二进制小数,用n位小数字段frac编码

E  阶码的作用是对浮点数加权,权重是2的E次幂,用阶码字段exp编码


float,即单精度浮点格式中,s占1位、exp占8位,frac占23位

double,即双精度浮点格式中,s占1位,exp占11位,frac占52位

根据exp的值,编码后的值可分为三种不同情况

1、规格化的

     exp的位模式不为全0也不为全1,此时阶码的值 = e - Bias,e是无符号数,Bias是等于2^{k-1}-1的偏置值;frac描述小数值f;而尾数定义为1+f

2、非规格化的值

    exp的位模式全为0,此时阶码值 = 1 - Bias,尾数的值为M = f

3、特殊值

    exp的位模式全为1,小数域全0时表示无穷

猜你喜欢

转载自blog.csdn.net/yhl_sophia/article/details/85257870