深度解剖数据在内存中的存储(5)

94 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

:star: 重点归纳总结

  • 计算机中数据的存储和计算都是以补码的形式进行的!
  • 整型提升还有截断的对象也是针对补码。
  • 无符号整型提升,二级制位补充0,有符号整型提升,二进制位补充符号位。
  • %u(无符号打印)自动认为打印的数据是无符号数据,所以存储的补码也就是原码,%d(有符号打印)认为打印的数据是有符号类型的,要将数据转换成原码打印输出!

:sweat_drops: 浮点型在内存中的存储

我们已经学会了整型在内存中的存储,你肯定会好奇,浮点型数据该怎样存储在内存中呢?

常见的浮点数:

3.14159 1E10  2.7 

浮点数家族包括:

floatdoublelong double 类型。

浮点数表示的范围: vsfloat.h有详细介绍浮点数的表示范围,有兴趣的伙伴可以期查阅一下,bug郭截取了一段供大家参考:

// float.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// Implementation-defined values commonly used by sophisticated numerical
// (floating point) programs.
//
#pragma once
#ifndef _INC_FLOAT // include guard for 3rd party interop
#define _INC_FLOAT

#include <corecrt.h>

#pragma warning(push)
#pragma warning(disable: _UCRT_DISABLED_WARNINGS)
_UCRT_DISABLE_CLANG_WARNINGS

_CRT_BEGIN_C_HEADER



#ifndef _CRT_MANAGED_FP_DEPRECATE
    #ifdef _CRT_MANAGED_FP_NO_DEPRECATE
        #define _CRT_MANAGED_FP_DEPRECATE
    #else
        #ifdef _M_CEE
            #define _CRT_MANAGED_FP_DEPRECATE _CRT_DEPRECATE_TEXT("Direct floating point control is not supported or reliable from within managed code. ")
        #else
            #define _CRT_MANAGED_FP_DEPRECATE
        #endif
    #endif
#endif

大家肯定会疑问,这是个啥,看不懂啊,其实bug郭也看不懂,哈哈哈,不过问题不大! 在这里插入图片描述

浮点型的其类型说明符有float 单精度说明符,double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围 1.7E-308~1.7E+308,可提供16位有效数字。

兄弟们,我们写个代码看看,你就了解了浮点型!

#include<stdio.h>
int main()
{
    int n = 9;
    float *pFloat = (float *)&n;
    printf("n的值为:%d\n",n);
    printf("*pFloat的值为:%f\n",*pFloat);
    *pFloat = 9.0;
    printf("num的值为:%d\n",n);
    printf("*pFloat的值为:%f\n",*pFloat);
    return 0;
}

输出结果会是怎么样的?会是像我们整形数据那样分析吗? 结果肯定是否定的!

运行结果: 在这里插入图片描述 可以看到打印结果完全出乎我们意料,num *pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大? 要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。所以我们可以知道,浮点型数据和整型数据在计算机中有着不一样的存储方式!