信息发布→ 登录 注册 退出

C语言中数据的存储详解

发布时间:2026-01-11

点击量:
目录
  • 1.内置类型
    • (1)整型数组
    • (2)浮点型
  • 2.自定义类型
    • 3.指针类型
      • 4.空类型(void)
        • 字符型
        • 浮点型
          • (一)
          • (二)
      • 总结

        数据的存储首先就要说到数据的类型,类型决定了看待内存空间的视角。

        C语言的数据类型分为内置类型和外置类型

        1.内置类型

        (1)整型数组

        char(字符型)、short(短整型)、int(整型)、long(长整型)(signed 或者 unsigned

        (2)浮点型

        float(单精度浮点型)、double(双精度浮点型)

        2.自定义类型

        (1)数组类型

        此处需要注意的是,去掉数组名就是数组的类型

        比如int arr[10],去掉数组名arr,int [10]就是数组数据类型

        (2)结构体类型(struct

        (3)枚举类型(enum

        (4)联合类型(union

        3.指针类型

        4.空类型(void)

        数据的存储形式就是以计算机的原码反码补码进行存储的

        浮点型:不以原反补的形式进行存储

        其他的数字又分为有符号数和无符号数

        无符号数:无符号数的原反补三种码是一致的,存储的时候没有区别

        符号数来:正数的原反补码是相同的,但是负数的原反补码需要经过运算转化(正数的最高位是0,负数的最高位是1)

        原码:将二进制按照正负数形式翻译为二进制数字

        反码:将原码的每一位取反

        补码:反码+1

        存储的时候一般存储数字的二进制序列补码

        同时数据的存储存在大小端

        内存空间具有编号,编号小的为低地址,编号大的为高地址

        大端存储:数据的低位保存在内存的高地址中

        小端存储:数据的低位保存在内存的低地址中

        每个机器的存储方式不同,可以用如下一段简单代码来观察电脑是哪一种存储方式

        #include<stdio.h>
        int main()
        {
        	int a = 1;
        	char* p = (char*)&a;
        //此处将整型地址强制转化为字符型
        //强制转化并不影响地址的存储,只会影响读取
        //指针决定读取内存的位数,字符型指针在解引用时只解1字节,整型指针在解引用时解4字节
        //a存储时,a是正数,原反补相同
        //00000000 00000000 00000000 00000001
        //指针在强制转化为字符型之后只能读取该内存的前8位
        //如果该指针解引用后结果是1,该数据存储结果为00000001 00000000 00000000 00000000
        //如果不是,该数据存储结果为00000000 00000000 00000000 00000001
        	if (*p == 1)
        	{
        		printf("小端\n");
        	}
        	else
        	{
        		printf("大端\n");
        	}
        	return 0;
        }

        字符型

        char/signed char 所对应的存储区间为-128~127,同时规定10000000为-128。

        为了理解signed与unsigned,适用如下例题

        #include<stdio.h>
        int main()
        {
        	unsigned int i;
        	for (i = 9; i >= 0; i--)
        //在这个循环开始之前就需要注意到,i需要小于0,该循环才会停止
        //但是此时的i是一个unsigned类型,本身存储的时候并没有预留符号位,是没有办法破开循环的
        //该循环是死循环
        	{
        		printf("%d", i);
        	}
        }

        signedunsigned的区别就在于能否表示正负数

        在数据的存储时,是否存在符号位

        signed char与char类型的存储也可以用一个图来说明

        中间的分界线即为正负分界线,第一位即为符号位。符号位为1是负数,符号位为0即为正数

        理解char的存储范围,借用如下例题

        #include<stdio.h>
        #include<string.h>
        int main()
        {
        	char a[1000];
        	int i;
        	for (i = 0; i < 1000; i++)
        	{
        		a[i] = -1 - i;
        	}
        	printf("%d", strlen(a));
        	return 0;
        }
        //i是int类型,可以随着循环不断增长,但是对于a这个数组来说,能存储的数据有限。
        //数组a是字符型,字符型数组能存储的范围就是-128~127之间,一共255个数,所以数组长度也是255

        运行结果:255

        int等类型的存储方式与char相似,这里就不在多做赘述

        利用一个例子来证明浮点型存储与整型存储不同

        #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("n的值为:%d\n", n);
        	printf("*pfloat的值为:%f\n", *pfloat);
        //此处通过单精度浮点型的指针更改原本存储在整型中的数字,并将其更改为单精度浮点型数字
        	return 0;
        }

        输出结果:

        n的值为:9
        *pfloat的值为:0.000000
        n的值为:1091567616
        *pfloat的值为:9.000000

        由此可见,单精度浮点型的指针并不能成功取出原本存储在整形中的数字,而第二步中通过单精度浮点型的指针所更改的整形的值,n也无法成功取用,所打出来的数字并不是9。由此可见二者的存储方式是存在较大差异的,所以下面对浮点型的存储方式进行讲解。

        浮点型

        浮点型并不依靠数据的原反补码进行存储

        浮点型有其特殊的规定

        (E也可以理解为最高此项所对应的阶次)

        用实例来证明一下

        比如8.5这个浮点数

        转化为二进制

        1000.1

        对于这个数而言,存储成图中形式就是

        (-1)^0*1.0001*2^3

        存储就是

        0 00000011 00000000000000000010001

        此时假设我们所申请到的内存是一个条状,那么对于浮点数而言的数据存储方式如图所示

         

         单精度浮点型对应的就是图一中所示,SME分布在不同的位置,图二的所示为双精度浮点型,双精度与单精度浮点型所对应的E与M不同。

        (一)

        就是E的值,既不能全为0,也不能全为1,且E的存储值与真实值不相同

        为了表示极小的小数,比如1*10^-10,因为E本身不具有符号位,所以不能表示负数

        单精度:E=真实值+127

        双精度:E=真实值+1023

        加完之后再转化为二进制存储为E,拿出来使用的时候再将这个数字减去

        特殊情况1:E为全0

        单精度的E此时的真实值为-127,该浮点数几乎等于0,是一个几乎不存在的数字

        特殊情况2:E为全1

        单精度的E此时的真实值为128,该浮点数是为正负无穷大的数字

        (二)

        对于M来说,M的值既然是在区间【1,2)之间,则位于整数部分的肯定为1

        再次利用单精度浮点型存储8.5

        该数字的M为1.0001

        为了能让浮点数表达更大的数字,且M中处于个位的数字固定为1,之后就规定,M中个位的1可以不再进行存储,等到取用的时候再进行添加。

        总结

        本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

        在线客服
        服务热线

        服务热线

        4008888355

        微信咨询
        二维码
        返回顶部
        ×二维码

        截屏,微信识别二维码

        打开微信

        微信号已复制,请打开微信添加咨询详情!