数据表示

来源:互联网 发布:网络商业通 编辑:程序博客网 时间:2024/05/01 21:46
    所谓的数据表示指的是:数据在计算机内部的表示形式,即能够被计算机硬件直接识别可以直接被指令系统调用的数据。分为数值数据和非数值数据两大类。本篇博客主要讲一下数值数据的表示。那么数值型的数据又分为无符号数和有符号数。

无符号数

    无符号数在表示时将所有的二进制位都用来表示数值。无符号数与真值的正数形式相同。这里提一下真值的概念,即带+、-号的实际值,例如+3、-5。这里看个实例吧:十进制数185。它在计算机中表示为10111001,实际就是直接十进制转化为二进制就对了。关于进制转换这里不说了。

有符号数

    有符号数呢,在表示时将其符号数值化。“+”用“0表示”,“-”用“1”表示。并且通常这个符号放在二进制数的最高位,称为符号位。有符号数有主要三种编码方法:原码、补码、反码。

    原码

    原码表示法是有符号数最简单的表示方法,机器数的(二进制)最高位表示符号,“+”用“0表示”,“-”用“1”表示,其余部分为数的绝对值。看看原码的定义:


    原码与真值的转换

    真值→原码:真值为正原码与真值相同;真值为负在最高位用“1”表示。原码→真值:原码为正同上,负数只需将符号位改为“-”表示。如下:

     
    原码的特点:表示直观,与真值之间的转换简单,同时进行乘除法的运算比较容易。但是加减法时就比较麻烦。另外0用原码表示时有两种情况:[+0]=00000000,[-0]=10000000。这势必会对程序的运行有不良影响。为了解决以上问题,就出现了另一种编码方式:补码

    补码

    这里首先需要引入一个膜的概念来理解补码。在循环队列里我们知道,为了改善队列懂满的状态到全部退队后指针无法回溯的问题,我们引入了取余法来确定指针位置。这里队列的长度即为模。这里再举一个例子,假设钟的时针是6点的位置而正确的时间为4点,那么这时后我们可以往顺时针方向旋转指针10个小时即(6+10)mod=4点,同时也可以逆时针旋转2个小时,即6-2=4点。这里12就是模,而-2和10对12同余。也可以说-2的补码是10。

    由以上可以知道,对于一个确定的模来说加上一个负数会等于加上这个负数的补码(舍去最高位产生的进位)。在计算机中小数的模永远为2,整数的模和位数有关。如果计算机的字长为n+1位那么模为2^n+1。

    补码与真值的转换

    由真值→补码:正数的补码和真值一样。负数的补码本来是需要引入模的计算,但是很麻烦。因此可以从借助原来得到补码(原理尚不清楚),即对符号位以外的位取反后+1。同时这里还有一个简化的方法,大家自己再百度一下吧。
    由补码→真值:对符号位以外的位取反+1得到原码,然后由原码再得到真值。这个不举例了。
   反码:其实以上就已经用了,就是对符号位以外的位取反就完了。
   总结:这里补码的理解还是比较重要的,补码的来源是同余的原理。用时钟的例子最好理解。那么到此结束!
3 0