0.11 数据在内存的存储

数据在内存中到底是怎么存的?

一、数据类型(内置)介绍

这里,看看 long 和 int 到底是什么定义的。

大小决定使用范围! 这句话,讲的很好。

1.1 整型家族

unsigned 和 signed 的用处? signed 最高位是有符号位,没有意义,不是有效数值。 但是,unsigned 就有意义,每一位都可以表示有效数值。 这一部分,我用红笔,隔开了。 没有负数的,就是 unsigned

1.2 浮点型家族

1.3 构造类型

先知道有什么,后面再说。

1.4 指针类型

先知道后面再说,

1.5 空类型

二、整形在内存中的存储

补码可以把加法和减法统一处理。

计算: 1-1 >> 1+(-1) 可以看到,原码计算会出错, 补码计算,会成32+1 位, 33位,最高位,符号位会丢掉。 但是在计算的时候 实际上是参与运算了, 只是 int 定义为32位, 直接丢掉最高位, 这是c语言设计的哲学, 这样计算就没有问题。 但是在计算的时候,根本没有去思考,到底哪一位是数值位,哪一位是符号位,直接就算了。 这就是“ 将符号位和数值位进行统一”。

想想背后的设计者的 伟大!

原码和补码的相互转换,不需要额外的硬件电路。 >> 计算逻辑是一样的, 就是 取反 +1

三、大小端

数据在内存中到底是按照什么规则来存储的? 低到高 或者 高到低 这是两种 存储方式

这东西,记住就行。

怎么拿 起始地址? &a >> int * 类型 这就找到a &a取的是起始地址 *&a 就是取地址a,访问这个a,int * 是 四个字节 。

插入:

怎么进行强制类型转换,int转换成char:

int a = 42; // 假设a是一个int类型的变量
int *ptr = &a; // 指针ptr指向a

char *char_ptr = (char *)ptr; // 将int类型的指针转换为char类型的指针

这里使用了类型转换(char *)将int类型的指针ptr转换为char类型的指针char_ptr。

*&a 就是取地址a,访问这个a,int * 是 四个字节 。 *(char*)&a 强制类型转换为char * * >> (char *)&a 就是拿第一个字节 因为 char * 是1字节。

&a : 整型指针解引用,访问的是4个字节, char* 强制类型转换, 就是1字节 *(char*)&a 这里还有一个强制类型转换,确实很6.

这里比较难理解其实,花了一下午时间去搞,中途还复习了二级指针。你最后看这个代码的呈现,确实很巧妙,用一个条件来表示想法,用if进行判断,太棒了这个程序,但是它背后却是一系列很复杂的思考。

#include <stdio.h>
int main()
{

    int a = 1; // 假设a是一个int类型的变量

    if (*(char *)&a == 1 /* condition */)
    {
        /* code */
        printf("XD\n");
    }
    else
    {
        printf("DD\n");
    }
    printf("%p\n", &a);
    printf("%d\n", a);

    return 0;
}

第二种比较啰嗦的写法:

int main()
{
    int a = 1;
    int *b = &a;  // 取a的地址,用指针b来存
    int **c = &b; // 二级指针

    int d = *&a; // 访问a >> int*  4个字节

    char *e = (char *)b; // 将int指针类型转换为char指针类型

    printf("&a Address of a is %p\n", &a);
    printf("*b Address of a is %d\n", *b);
    printf("**c Address of a is %d\n", **c);

    printf("d Address of a is %d\n", d); // d >> a=1

    printf("e Address of a is %p\n", (void *)e); // 打印char指针的地址,转换为void *类型

    if (*e == 1 /* condition */)
    {
        /* code */
        printf("XD\n");
    }
    else
    {
        printf("DD\n");
    }
    return 0;
}

三、浮点型在内存中的存储

2023-11-20 更

小数和浮点数在内存中有可能无法完全保存,会有精度丢失的问题。以下仅为举例说明,具体看ipad有演算。

浮点数在内存中具体存储,SME, 规则如下:

32位 。 1 8 23

64位 。 1 。 11 。 52

这个规则也是记住就行,

3.1 关于E的存储。 的举例说明

代码举例: S >> E >> M 存储 最后写成16进制 注:还可以看到,不够的话,可以在有效值M 后 补0占位

Last updated