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

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 00000001if (*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);}
}

signed与unsigned的区别就在于能否表示正负数

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

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可以不再进行存储,等到取用的时候根据E的值再进行添加。

比如8.5的存储

原本的存储形式是

0 00000011 00000000000000000010001

优化之后的存储形式就是

0 00000011 00000000000000000000001

关于c语言中数据的存储相关推荐

  1. c语言中静态存储类别是,小议C语言中数据的存储类型

    C语言中的一些说明和定义会用到存储类型这样一个概念,在C语言中存储类型会用到下述几个关键字:auto,static,register,extern. 看下面的简略图大家可以明确程序在进行存储时是分为三 ...

  2. c51语言中数据的存储类型,C51-数据存储类型

    KEILCx51是面向8051系列单片机及其硬件控制系统的开发工具.它定义的任何数据类型必须以一定的存储类型的方式定位在8051的存储区中,否则便没有任何的实际意义.该编译器通过将变量.常量定义成不同 ...

  3. C语言——整形数据的存储

    C语言--整形数据的存储 前言 一.原反补码 二.大小端 计算机对数据的存储方式可分为大端存储和小端存储模式. 三.整形的截断与提升 1.整形截断 2.整形提升 举例说明 前言 C语言中整形数据的存储 ...

  4. C语言中数据的表现形式及其运算

    C语言中数据的表现形式及其运算 1. 常量和变量 1.1 常量 在程序运行过程中,其值不能被改变的量称为常量.如1000,0.0036,0.0025是常量.数值常量就是数学中的常量. (1)整型常量. ...

  5. c语言中负数的读取和存储,C语言中负数的存储方式

    详细介绍负数的文章: https://blog.csdn.net/daiyutage/article/details/8575248 1.以char类型举例,其取值范围是 -128 ~ 127,即-2 ...

  6. Matlab中数据的存储方式

    简介 MATLAB提供了丰富的算法以及一个易于操作的语言,给算法研发工作者提供了很多便利.然而MATLAB在执行某些任务的时候,执行效率偏低,测试较大任务量时可能会引起较长时间的等待.未解决这个问题, ...

  7. opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类

    opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...

  8. ADS下C语言中局部变量的存储位置分配

    ADS下C语言中局部变量的存储位置分配 发布:xlander | 发布时间: 2008年8月12日 做研发很多年了,起初开发的软件都是在台式机上运行的,台式机上丰富的资源从来没让我仔细的思考过有关变量 ...

  9. datasg中数据的存储结构

    datasg中数据的存储结构 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/27/3845623.html

最新文章

  1. commit your changes or stash them before you can merge
  2. Java Websocket实例
  3. mysql二维数据转一维存_二维数组转一维数组
  4. OpenCV与图像处理学习十三——Harris角点检测(含代码)
  5. P2660 zzc 种田( python3实现)
  6. 拼装机器人感想_智能机器人心得体会
  7. 【新手入门篇】新浪微博应用开发之Java入门篇
  8. mysql 做回归模型_技术分享 | 我对 MySQL 隔离级别的剖析
  9. 心跳脑裂解决方案之Heartbeat的Stonith配置
  10. 汤立波:车联网最新发展动态
  11. Ubuntu下Tinyos安装步骤
  12. k均值聚类算法原理和TensorFlow实现
  13. 教你三秒钟将电脑速度提高三倍
  14. 解决ubuntu18.04听不到声音(很简单,不用每次开机都调)
  15. 寂静岭3java攻略_《寂静岭3》完整流程攻略
  16. IGBT最小死区时间计算
  17. SQL查询学生表中每课大于85分的同学名称
  18. 联想小新 Pad Pro 12.6 怎么样
  19. matlab拟合斜椭圆,椭圆拟合及拟合度评价
  20. 数据库存储时间戳,13位时间戳转换位10位时间戳

热门文章

  1. JS开发HTML5游戏《神奇的六边形》(四)
  2. 搜狗搜索图片查看器调用帮助
  3. 医疗器械行业迎来黄金十年,集团采购系统助力企业把握机遇,实现高质量发展
  4. python量化实战 顾比倒数线_龙腾四海:顾比倒数线+顾比均线
  5. 【算法竞赛学习笔记】KD-Tree
  6. go 切片排序以及转为带间隔符的字符串
  7. 原码、反码、补码、移码存在的意义
  8. pod init 报错 can‘t modify frozen String (FrozenError) [Xcodeproj] Unknown object version (56).
  9. Mosfet管开关管损耗、导通损耗、驱动损耗-计算方法公式及解释
  10. No overload matches this call. Overload 1 of 2, ‘(type: “*“, handler: WildcardHandler<Record<EventTy