计算机内数字的表示

计算机中的数字有三种表示:无符号数、补码(带符号数)、浮点数

信息的存储与寻址:计算机中将字节作为最小可寻址单元。而字节的排列顺序分大端法和小端法两种。大端法就是指将最高位放在最前面的存储方式,而小端法则是将最低位放在最前面的存储方式。

C语言中的移位运算:

  • 左移:将x向左移动k位,丢弃最高的k位,并在右端补k个0
  • 逻辑右移:将x向右移k位后,在左端补k个0
  • 算术右移:将x向右移k位后,在左端补k个最高有效位的值。

带符号数与无符号数的转换:

带符号数->无符号数:若x<0,则返回x+2w

          若x>=0,则返回x

无符号数->带符号数:若x<=TMax,则返回x

          若x>TMax,则返回x-2w

整数的扩展:将一个较小类型的数,转换为较大类型

      无符号数,在数字的二进制表示的开头添0,这被称为零扩展

      带符号数,在数字的二进制表示的开头添加最高有效位的值符号扩

整数的截断:将一个较大类型的数,转换为较小类型

      无符号数,先将数字的二进制表示直接转换成对应的无符号数,然后再用这个无符号数进行模2的k次方运算

      带符号数,先将数字的二进制表示直接转换成对应的无符号数,然后再用这个无符号数进行模2的k次方运算,然后经过模运算后得到的无符号转转换成带符号数。 

无符号数加法:若x+y≥2w(溢出),则为x+y-2w;否则为x+y

       溢出判断:令s=x+y,当且仅当s<x或者s<y时,发生了溢出

无符号数的非:若x=0,则为x,否则为2w-x

带符号数加法:若x+y≥2w-1,则为x+y-2w(正溢出);若x+y<-2w-1,则为x+y+2w(负溢出);否则为x+y

       溢出判断:令s=x+y,当且仅当x>0,y>0,但s<=0时,发生了正溢出;当且仅当x<0,y<0,但s>=0时,发生了负溢出

带符号数的非:若x=TMIN,则为x,否则为-x

无符号数的乘法:(x*y) mod 2w

带符号数的乘法:U2T((x*y) mod 2w)

乘以2的幂:对于无符号数,C表达式x<<k产生x*2k的值

       对于带符号数,C表达式x<<k产生x*2k的值

除以2的幂:无符号数处以2的幂,C表达式x>>k产生数值 floor( x/2k )

       带符号数除以2的幂,向下舍入,C表达式x>>k产生数值 floor( x/2k )

       带符号数除以2的幂,向上舍入,C表达式 ( x+(1<<k)-1)>>k 产生数值 ceil( x/2k )

浮点数:IEEE浮点标准用V=(-1)s * M * 2E的形式来表示一个浮点数

 

    

  • 在规格化的表示中,exp段既不是全1,也不是全0。在这种情况下,阶码字段被解释为以偏置形式表示的有符号数。也就是说,阶码的值E=exp-Bias,其中exp是一个k位的无符号数,而Bias则等于2k-1-1(即最高位为0,其余位为1)。而尾数定义为M=1+frac。
  • 在非规格化的表示中,即阶码域位全0的形式,在这种情况下,阶码值是E=1-Bias,而尾数的值是M=frac,也就是小数字段的值。
  • 在特殊情况下,当阶码域位全1的时候,如果小数字段位全0则表示无穷大,如果小数字段不为全0则表示这不是一个数(NaN)

浮点数的特殊值总结:

以一个8位的浮点数为例:

 

浮点数的舍入

  1. 向偶数舍入(即四舍五入)
  2. 向零舍入
  3. 向下舍入(相当于ceil函数)
  4. 向上舍入(相当于floor函数)

C语言中的浮点数

从int转换成float,数字不会溢出,但是可能被舍入。

从int或float转换成double,因为double有更大的位数,所以能够保留精确的数值。

从double转换成float,因为范围较小,所以值可能溢出成+∞或-∞。并且,由于精度较小,它还可能被舍入。

从float或者都变了转换成int,值将会向零舍入。

posted @ 2019-04-24 00:25  2hYan9  阅读(1289)  评论(0编辑  收藏  举报