当前位置 博文首页 > 是琳琳呀!的博客:深度剖析数据在内存中的储存

    是琳琳呀!的博客:深度剖析数据在内存中的储存

    作者:[db:作者] 时间:2021-08-27 18:41

    深度剖析数据在内存中的储存

    先从数据类型开始入手:
    数据类型包括整形,浮点型
    整形:
    char
    ------unsigned char
    ------signed char
    short
    ------unsigned short
    ------signed short
    int
    ------unsigned int
    ------signed int
    long
    ------unsigned long
    ------signed long
    浮点型:
    float
    double
    构造类型:
    ----数组类型
    ----结构体类型struct
    ----枚举类型enum
    ----联合类型union
    指针类型:
    int* p;
    char* pc;
    float pf;
    void
    pv;
    空类型:
    void表示空类型(无类型)
    通常应用于函数的返回类型,函数的参数,指针类型。
    这些就是C语言中的基本类型,在平时学习中也经常用到。

    接下来介绍整形在内存中的存储:
    一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。
    那数据在所开辟的内存中到底是如何存储的呢?
    计算机中有符号数有三种表示方法,即原码,反码,补码。
    三种表示方法均有数值位和符号位两部分,符号位都是用0 表示正,用1表示负,而数值位三种方法表示均不相同。
    我们先来看看什么是原码,反码,补码。
    原码:直接将二进制按照正负数的形式翻译成二进制就可以了。
    反码:将原码的符号位不变其他位依次取反。
    补码:反码加1;
    正数的原码,反码,补码都相同。
    对于整形来说:数据存放内存中其实存放的是补码。
    为什么呢?
    在计算机系统中,数值一律用补码来表示和存储,原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以同一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

    知道了存储方式那么存储的顺序是什么呢?
    大小端的介绍:
    大端模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
    小端模式:是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。
    一般电脑是小端模式;手机属于大端模式。

    /*设计一个小程序来判断当前机器的字节序*/
    #include<stdio.h>
    int check_sys()
    {
    int i=1;
    return (*(char *)&i);
    }
    int main()
    {
    int ret=check_sys():
    if(ret==1)
    {
    printf("小端\n");
    }
    else
    {
    printf("大端\n");
    }
    rturn 0;
    }
    
    

    看这个代码

    #include<stdio.h>
    int main()
    {
    char a=-1;
    signed char b=-1;
    unsighed char c=-1;
    printf("a=%d,b=%d,c=%d",a,b,c);
    return 0;
    

    输出的是a=-1,b=-1,c=225.
    a,b都是有符号的,b是无符号数,负数在内存中存储是存储它的补码,所以他们三个都应该先进行原,反,补操作,因为是字符类型,占2个字节八位,所以截断保留8个二进制数在因为打印的是%d进行类型的提升开始补位,符号位是什么就补什么位,a,b都是有符号的负数故还需进行减一求反操作打印出最后的结果,而c无符号数,补得符号位为0,且不用进行减一取反操作。
    再来看这个:

    int main()
    {
    char a[1000];
    int i;
    for(i=0;i<1000;i++)
    {
    a[i]=-1-i;
    }
    printf("%d",strlen(a));
    return 0;
    }
    //这个输出的结果是255;char有符号类型范围为-1~-128;127~1,0,这个循环到0是停止,因为strlen遇到0,'\0',NULL停止,故循环255次。
    
    cs