`

float和double类型数据在内存中的存储方法

 
阅读更多

float和double类型数据在内存中的存储方法

 

浮点数(单精度的float和双精度的double)在内存中以二进制的科学计数法表示,表达式为N = 2^E * F;其中E为阶码(采用移位存储),F为尾数。

float和double都由符号位、阶码、尾数三部分组成,float存储时使用4个字节,double存储时使用8个字节。各部分占用位宽如下所示:

             符号位     阶码      尾数     长度

float              1           8         23      32

double          1         11        52      64

 

 

符号位:0代表正数,1代表负数。

阶码:用移位表示法存储科学计数法中的指数数据:float阶码占8位,取值范围-128~127,但并没有按照移位表示法+128,而是+127。同理double要+1023。

尾数:尾数部分:用二进制的科学计数法表示后,去掉小数点前面恒定的1,只保留小数点后面的二进制数据,存入尾数位置即可。

上述中阶码也是指数位,但阶码和尾数的描述显然是看不懂的。我们继续。

 

比如8.25,二进制科学计数法表示为:1.00001*2^3,具体转换方法:8的二进制1000;.25的二进制.01:即0*2^(-1) + 1*2^(-2)。写为:1000.01,小数点左移3位,即转换完毕。

符号位确定:8.25为正数,符号位为0。

阶码的表示:阶码位3+127=130;二进制10000010,已经是8位。

尾数的表示:去掉小数点前面的1,为00001,后面补充0至23位:000 0100 0000 0000 0000 0000

最终8.25在内存里存储的二进制为:0100 0001  0000 0100  0000 0000  0000 0000

 

又比如11.4,二进制科学计数法表示:float:1.01101100110011001100110 * 2^3,double:1.0110  1100 1100  1100 1100  1100 1100  1100 1100  1100 1100  1100 1101 * 2^3,所以他们的值其实是不同的,因为.4用二进制无法精确表示,这也就是为什么float类型数据和double类型数据都存储11.4,但是对比起来,他们不相等的原因。比如float a = 11.4; double b = 11.4; 要让他们正确对比,比如((float)b == a),让double数据舍弃比float多的那些尾数。

 

对于double型数据,只要将阶码前面加0扩展到11位,尾数后面补充0至52位即可。

 

移位表示法:在数X上加一个偏移量,常用于表示浮点数中的阶码(注意阶码的偏移量和移位表示法定义有差别)。

定义:若X为纯整数,X[移] = 2^(n-1) + X,-2^(n-1) <= X < 2^(n-1);若X为纯小数,X[移] = 1 - X,-1<= X < 1

 

 

#include <stdio.h>

#define print_float(a) print_bitxx(a, 4)
#define print_int(a) print_bitxx(a, 4)

#define print_double(a) print_bitxx(a, 8)

int is_little_endian()
{
    short int x = 0x0001;
    return ((char*)&x)[0];
}

void print_bitxx(const void *a, int bytes)
{
    const unsigned char *pos = (const unsigned char *)a;
    int i, j;
    int max_i = bytes - 1;
    if (is_little_endian()) {
        for (i=max_i; i>=0; i--) {
            for (j=7; j>=0; j--) {
                printf("%d", ((pos[i] & (1 << j)) ? 1 : 0));
                if (j == 4 || j == 0)
                    printf(" ");
            }
            printf(" ");
        }
    }
    printf("\n");
}

int main(int argc, char **argv)
{
    float a = 11.4;
    double b = 11.4;
    print_float(&a);
    print_double(&b);
    printf("%d\n", a == (float) b);
    printf("%d\n", (double)a == (double) b);
    return 0;
}

 

分享到:
评论

相关推荐

    c语言 float double数据类型的内存中的存储和验证

    ### C语言中float与double数据类型的内存存储及验证方法 #### 一、浮点数的基本概念 在C语言中,`float` 和 `double` 类型用于存储实数,即带有小数点的数值。这两种类型的主要区别在于它们在内存中的占用空间不同...

    基于C++浮点数(float、double)类型数据比较与转换的详解

    在C++编程语言中,浮点数类型包括`float`和`double`,它们用于表示非整数值。本文主要探讨的是这两个类型的数据在比较和转换过程中的一些关键知识点。 首先,浮点数在内存中的存储机制遵循IEEE 754标准,不同于整型...

    HEX-Float转换工具 16进制转成float 或double类型数据的一个小工具

    在计算机中,根据IEEE 754标准,float和double类型的浮点数有不同的存储格式。float通常占用32位(4字节),其中1位用于符号,8位用于指数,23位用于尾数;double则占用64位(8字节),其中1位用于符号,11位用于...

    Keil MDK-ARM各种数据类型占用的字节数 char short int float double

    本文将详细解析标题和描述中提到的各种数据类型在Keil MDK-ARM下的字节数占用情况。 首先,Keil MDK-ARM是一个针对ARM微处理器的嵌入式开发工具包,它包含了一个强大的C/C++编译器。在32位的ARM架构中,数据类型的...

    STM32Flash闪存存储,支持多种类型操作(double,float等)

    在实际应用中,经常需要将数据存储在芯片的Flash内存中,以实现程序的固态存储或者数据持久化。本知识点主要围绕STM32的Flash闪存存储展开,讲解如何支持多种数据类型的存储,包括double和float等浮点型数据。 一、...

    十六进制(HEX)和浮点类型(float、double)转换工具

    而浮点类型,如float和double,是用于存储小数的数值类型,广泛应用于科学计算、图形处理等领域。了解和掌握十六进制与浮点类型的转换是每一位IT专业人员的基本技能。 十六进制是一种逢16进1的计数系统,使用16个...

    C# 按照IEEE 754标准对Float和Double类型进行转换

    在编程领域,尤其是在使用C#语言时,理解数据类型的内部表示和操作是非常重要的。本话题主要聚焦于如何根据IEEE 754标准来处理和转换浮点数类型,包括`float`和`double`。IEEE 754是国际上广泛采用的一个标准,用于...

    float_double.c

    将32bit的float型数据 转换为 64bit的double类型存储在内存中,跨平台可用。解决C51等平台double类型为32bit存储的问题。

    C语言中常用数据类型内存存储形式

    首先,C语言中数据类型主要包括基本数据类型和构造数据类型,这里讨论的基本数据类型包括布尔类型(bool)、字符类型(char)、整型类型(short、int、long)、浮点类型(float、double)等。 布尔类型(bool)通常占用一个...

    float型和double型数据的存储方式1

    本文主要探讨了浮点类型数据,即float和double在内存中的表示方式,以及由此产生的精度问题。 首先,浮点类型数据有两种主要形式:单精度(float)和双精度(double)。float在内存中占用32位,而double占用64位。这...

    C语言中floatdouble的区别.pdf

    在存储float类型数据时,首先将十进制数值转换为二进制的科学计数法表示,然后将符号位、指数位和尾数部分组合起来存储在内存中。例如,数值8.25的存储方式如下图所示: double类型是双精度浮点数,它占用8个字节的...

    float_double存储问题

    float 和 double 是 C 语言和 C# 语言中最常用的浮点类型,它们分别使用单精度和双精度来存储浮点数据。 float 数据占用 32bit,而 double 数据占用 64bit。 在 IEEE 的规范下,float 遵从的是 IEEE R32.24,而 ...

    C语言中floatdouble的区别[参照].pdf

    在C语言中,float和double是两种基本的浮点数类型,它们之间的区别在于它们的精度、内存占用和表示范围。 float是一种单精度浮点数类型,占用4个字节的内存空间,有效数字位数为6-7位,表示范围为-3.4*10(-38)~3.4*...

    c语言中的数据在内存中的存储形式

    了解数据在内存中的存储形式是非常重要的,因为它直接关系到程序的正确性和效率。 在C语言中,数据类型可以分为基本内置类型、数组类型、结构体类型、枚举类型和联合类型等。基本内置类型包括整形家族、浮点数家族...

    float double精度的详细解释

    ### float与double精度详解 #### 一、浮点数的基础概念 ...了解`float`和`double`的区别及其内部表示方式,有助于开发者在选择合适的数据类型时做出正确的决策,尤其是在涉及高精度计算或大范围数值时尤为重要。

    详解java中float与double的区别

    在 Java 中,float 和 double 都是基本数据类型,它们在定义和使用时都有其特点和限制。 float 和 double 都可以用来表示实数,但是它们的精度和取值范围不同。 float 的精度是 8 位有效数字,取值范围是 10 的 -38 ...

    Java核心基础+Java中的数据在内存中的存储

    #### 二、Java中数据的内存存储方式 **2.1 基本数据类型的存储** Java的基本数据类型包括`int`、`short`、`long`、`byte`、`float`、`double`、`boolean`和`char`。这些类型的数据通常存储在栈中,因为它们的大小...

    char ,int,long,float,double,等在64位和32位下分别占多少字节

    本文旨在探讨编程语言中常见的基本数据类型(`char`, `int`, `long`, `float`, `double`)在32位与64位操作系统环境下所占用的字节数量,并深入分析这些差异产生的原因及其对程序设计的影响。 #### 1. 数据类型的...

Global site tag (gtag.js) - Google Analytics