用二进制表示的数

Posted shield

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用二进制表示的数相关的知识,希望对你有一定的参考价值。

  计算机中的数,是用定点数浮点数表示。

  定点数:小数点位置固定的数,整数和纯小数是用定点数来表示的,分别称为定点整数和定点纯小数。

  浮点数:对于既有整数部分、又有小数部分的数,一般用浮点数表示,浮点数的小数点位置是不固定的,可以浮动。

   如:234,4563,0.433 0.32134 等是定点数 而 454.32 234.5466等是浮点数。

  对于定点型整数,小数点的位置默认在数值最低位的右边。计算机能表示的定点整型数的大小范围并不是任意的,它与计算机本身的字长有关,还与程序语言的实现环境有关。45.

  对于定点纯小数,小数点的位置固定在符号位与最高数值位之间。显然,定点纯小数所能表示数的范围较小,并不能满足实际问题的需要。定点纯小数的精度与计算机本身的字长有关,与程序语言的实现环境有关。

  ※ 在大多数计算机中,存储浮点数时,都会把浮点数转换成两个部分:整数部分和纯小数部分。

   整型数的二进制表示:对于整型数而言,又分为有符号和无符号的两种,有符号的整型数既可以是正数,又可以是负数,正负号由字节的最高位来表示,0表示正数,1表示负数。

  ??有符号的二进制数

    1.一个字节表示的数 

      如:1011 0100 其最高位的1为符号位,因此(1011 0100)的十进制数为:-(2^5+2^4+2^2) = -52。而0011 0100 的十进制数为:2^5+2^4+2^2=+52.  注:为了不浪费计算机的存储空间,对于“正零”和“负零”有不同的处理,对于“正零”(0000 0000),表示数字0:而“负零”(1000 0000),表示-128。

    2.两个字节表示的数

      如:1011 0100 1010 1101 其最高位的1为符号位,因此(1011 0100 1010 1101)的十进制数为:-(2^13+2^12+2^10+2^7+2^5+2^3+2^2+2^0)=-13485。而0011 0100 1010 1101 的十进制数为:(2^13+2^12+2^10+2^7+2^5+2^3+2^2+2^0)=+13485。

      “正零”(0000 0000 0000 0000)表示数字0,“负零”(1000 0000 0000 0000)表示数字-32768。

  ??无符号的二进制整数

      其最高位的0或1不再代表符号位,而代表具体的数值。

    1.一个字节表示的数

      如:1011 0100,它的十进制数为:2^7+2^5+2^4+2^2=180。

    两个字节同理,不再概述。

  有符号的整型数和无符号的整型数的取值范围:

    以一个字节为例:

      有符号1000 0000 到 0000 0000 即从-128【1000 0000】到127【0111 1111】总计256个值 = 2^8。

      无符号:0000 0000 到 1111 1111 即从0 到 255 总计256个值 = 2^8。

  

  浮点型数据的二进制表示:---------------------------------重点-----------------------------------

    浮点数在计算机中的表示可根据系统分配的字节数不同而分成单精度浮点数和双精度浮点数,通常,计算机会分配4个字节给单精度浮点数,分配8个字节给双精度浮点数。

   计算机在存储浮点数的时候,要将十进制浮点数转化成二进制来表示,转化的方法是先将浮点数转化成整数部分和纯小数部分,再将整数部分和纯小数部分分别转化成二进制。

   整数部分采用除2取余,直到商为0为止,最先得到的余数为最低位,最后得到的余数为最高位。

    技术分享图片 十进制的(58)=二进制的(111010)技术分享图片十进制的(0.625)=二进制的(0.101)

    于是十进制58.625转化为二进制111010.101

   小数部分采用乘2取整,直到余下的小数为0或满足精度要求为止,最先得到的整数为最高位,最后得到的整数为最低位。

   计算机对存储二进制表示的浮点数时,先要将其进行归一化,也就是要将其表示成整型数和纯小数的乘积形式。

      上面这个十进制58.625=二进制111010.101=二进制1.11010101*2^5,即把小数点位向左移了5位。

   目前c/c++语言都采用IEEE-754标准来表示浮点数的存储格式,在IEEE-754标准中,单精度浮点数用4字节(32位)来存储,双精度浮点数用8字节(64位来存储),分为三个部分:符号位、指数位和尾数。符号位表示数值的正负;指数位用于计算阶码,代表2的幂次;尾数为有效小数位数。

    ※ 单精度浮点数

    浮点数的一般表达式如下:(-1)s x 2e x m 

32位浮点数的字节分配空间
S     E           M

       其中S占1位,E占8位,M占23位。

    e是实际的阶码值,代表浮点数的取值范围m是尾数,代表浮点数的精度。

    S代表符号位,占1位。0代表正,1代表负。

    E称为“移码”,代表指数位,占8位,E的取值范围为0~255,实际取值为E=127+(即e=E-127),因此,e的取值范围为-127~+128。

    M代表有效位数或称为“小数”,它取自数位m的小数点后面的数,即m2=(1.m)2,在二进制数1.11010101中,m即为下划线所表示数字。

    注:将浮点数归一化后,小数点前面的1是不需要存储的。

    举例:10进制数58.625     58.62510  = (1110 10.101)=25 x (1.1101 01 01 0000)2这里尾数精度为12位

    在此:符号位 S=0;阶码e=5,尾数m=(1.1101 01 01 0000)因此E=127+e=127+5=132=(1000 0100)M=(1.1101 01 01 0000)2

    十进制数58.625在计算机中的存储方式为:

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
0 1 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        
     双精度浮点数的符号位S占1位,移码位占11位,尾数占52位,一共64位。存储原理与单精度浮点数一致,只不

    E = 1023+e 

    至于单精度浮点数e为什么要加127,双精度浮点数e为什么要加1023,将在原反补移码详细概述。                       

          

 

  

                    



以上是关于用二进制表示的数的主要内容,如果未能解决你的问题,请参考以下文章

C语言中16进制的表示方法

Java中的数是用补码表示的检验

状态压缩与二进制

P1100 高低位交换

数制与进制转换

洛谷——P1100 高低位交换