zoukankan      html  css  js  c++  java
  • 定点数和浮点数在计算机中的表示

    第一篇随笔,试一试水吧。本来想自己搭建一个博客,折腾了许久都没能做好,用现有的网站做随笔也是个选择。存一些跟计算机考研或者工作相关的随笔,希望我能够坚持下来。

    ----------------

    32位机为例。

    对于一个int整型数,在计算机中通常为4个Byte,即32个bits长度。一般理解上整型数指的是int long-int long-long-int这些数,当然也包括unsigned xxx。

    signed包含正数和负数以及0三个部分,而unsigned 标记的变量表示范围从0开始,不含负数。

    举一个例子,1000 0000 这个数,在普通char型下它隐含的值为-128,前面的1表示符号位,为负。在unsigned char中,它表示的就是2^8 ,也就是128。

    普通char型占内存为一个字节Byte,其范围是-128~127;而unsigned char值的范围为0~255。

    ------------------

    对于一个整数int,它占内存的大小为4个Byte,即32个bits。其表示范围为(-2^31 )~ 2^31-1 ,数字的有效表示位只有31位,最前一位用于表示正负。0为正,1为负。正数部分要减1是因为还有0的缘故。

    最大正数: 0 111 1111 1111 1111 1111 1111 1111 1111     0x7F FF FF FFH   2^31-1

    最小负数: 1 000 0000 0000 0000 0000 0000 0000 0000    0x80 00 00 00H    -2^31

    1. 值得一提的是,内存中显示的是补码而不是原码。所以最小负数的表示不是全1。最小负数的原码才是全1,取补码后为1后面跟31个0(人为特例规定,因为补码本身是要表数字的位数取反+1的)

    而最大正数的补码不用变,和原码一样。

    2. 也可以用“2的31次方减去后面31位对应的数表示绝对值”这种理解,但我觉得这么理解太绕了,而且原码补码和反码的知识更有用些。

    -------

    如果是unsign int,它能表示的值从0开始,0 ~ 2^32-1 32位都用于表示数。

    int型讲清楚以后,char型、long ing型等理解方式是一样的

    ---------------------------------

    浮点数部分,以float为例。

    浮点数和整型数不同的是,浮点数需要能够显示小数。它占用的内存和int型一样都是4个byte,一部分存整数的部分需要改为存放小数。

    这里是微软对浮点数的官方文档:

    https://docs.microsoft.com/zh-cn/cpp/build/ieee-floating-point-representation?view=msvc-160

    对于浮点数,它储存数的方式有些像是科学计数法。还是以signed 为例,

    第一位表示正负,后面8位表示阶码,一般计算机内使用的底数是2,所以这部分表示的就是2^N,就像是科学计数法中的aaa *10^n 一样,只不过换了一个底数。

    但有一处值得注意的地方,首先,阶码这部分保存的是移码,因而阶码存在一个“偏差”,就像是char和unsigned char显示数的区别一样。

    如果阶码部分是1000 0000,表示的数是128,但实际用到的数是128-127,也就是1,这部分的值为2^1。

    阶码为1000 0001,表示的数是129,实际用到的是129-127,也就是2,之后乘的也是2^2。

    --------

    后面23位表示的是尾数部分,值得一提的是,计算机默认这部分表示的数,小数点前面一定有一个1.的整数部分,也就是1.xxxx  这样的格式,这也使得浮点数能够变相地存储整数,虽然存数方式和内容不一样。这里对应的二进制表示是原码

    (小数部分和整数部分的表示不一样,第一位数表示0.5,第二位表示0.25,第三位是0.125,反复除以2,就像是“日捶其半”一样

    -----

    举几个例子:

    6  ,计算方式为1.5*2^2,二进制下为0 100-0000-1 100-0000-0000-0000-0000-0000

    1,计算方式为1*2^0,二进制下为 0 011-1111-1 000-0000-0000-0000-0000-0000

    0.75  计算方式为1.5*2^-1,二进制下为 0 011-1111-0 100-0000-0000-0000-0000-0000

    0.1  计算方式为1.6*2^-4  ,二进制下为0 011-1101-1 100 1100 1100 1100 1100 1101

    0比较特殊,计算方式为1*2^-128  ,也就是全0

  • 相关阅读:
    数据库表关联分析
    java异常信息分析
    版本问题
    项目
    EXCEL工具
    项目安全
    服务器环境
    vue公共
    Linux 文件权限
    nginx
  • 原文地址:https://www.cnblogs.com/namezhyp/p/14082534.html
Copyright © 2011-2022 走看看