深入理解C语言(1):数据在内存中的存储

标头
风景图片


  • 文章主题:数据在内存中的存储🌏
  • 所属专栏:深入理解C语言📔
  • 作者简介:更新有关深入理解C语言知识的博主一枚,记录分享自己对C语言的深入解读。😆
  • 个人主页:[₽]的个人主页🏄🌊

目录

  • 数据类型介绍
    • 整型
      • char(字符型)
      • short(短整型)
      • int(整型)
      • long(长整型)
    • 浮点型
    • 构造类型(自定义类型)
    • 指针类型
    • 空类型
  • 类型简析
    • 整型
      • 关键字
      • 表示方法
      • 存储
    • 浮点型
      • 关键字
      • 表示方法
        • 存储公式
        • S(符号位):
        • M(有效数字):
        • E(指数):
      • 存储
    • 构造类型
    • 指针类型
    • 空类型
  • 字节序(数据在内存中存储的顺序)
    • 高低字节位
    • 大小端
    • 字节序
  • 结语


数据类型介绍

整型

char(字符型)

char
unsigned char
signed char

short(短整型)

short [int]
unsigned short [int]
signed short [int]

int(整型)

int
unsigned int
signed int

long(长整型)

long
unsigned long [int]
signed long [int]


浮点型

float
double
long double


构造类型(自定义类型)

数组类型:
结构体类型:struct
枚举类型:enum
联合类型 union


指针类型

int*
char*
float*
void*
······


空类型

void


类型简析

整型

关键字

整型分为无符号整型和有符号整型两种,分别用关键字signedunsigned来表示,其中除了 char类型在C语言中没有明确表示用char来作为signed char的省略,而是取决于编译器之外,其余整型在不加signed时,均会默认成signed类型。

表示方法

整型二进制表示方法:原码、反码、补码;
转换方法:原码符号位不变取反 -> 反码,反码 + 1 -> 补码,补码 + 1 -> 原码;
特性:正整数原码、反码、补码相同;负整数原码、反码、补码需遵循转换方法计算得出。

存储

整数在内存中是补码形式的二进制序列


浮点型

关键字

浮点型没有无符号的类型,所以只要是浮点型就会自带符号,也就没有有无符号只类的概念一说。因为其在内存中的贮存方式和整型的原、反、补码的方式完全不同,因此专门为了整型数据设计出来的关键字signed以及unsigned对于浮点型来说并不适用。

表示方法

存储公式

根据IEEE(电气与电子工程师协会)的规定,浮点的存储公式为如下,其中内存中只储存S、M、E三个的数据。
( − 1 ) S ∗ M ∗ 2 E (-1)^{S}*M*2^{E} (1)SM2E

S(符号位):

因为只需通过0或1就可以来表示一个数据的正负,在所有浮点类型中都只占一个bit位。

M(有效数字):

在IEEE规定的标准中,M的存储类型为无符号整型(符号已经由符号位确定了),float型在内存中占23bit位,double型在内存中占52bit位,另外因为浮点的存储采用的是科学计数法,科学计数法浮点以前的数因为是有效位,所以在二进制中将浮点符号位丢弃之后单看这个无符号的整型,有效位只会是1,所以IEEE中还规定了去掉科学计数法中前面固定的1.而只取后半部分存入M中,这样的话储存空间等于是由原来的可保存23/52位有效数字变成了现在的可以保存24/53位有效数字了,等于是数据的存储量将比原储存空间又扩大了一位。

E(指数):

因为也是无符号整型,float型中占8bit位,double型中占11bit位,但是E完全有可能出现负数的情况,所以IEEE中又规定,对于8位的E加上中间数127,11位的E加上中间数1023,这样就可以实现负指数的效果,可能是因为一段内存中有多个符号位不好处理,实际上这样存储的指数范围和有符号存储的指数范围完全相同。

存储

float型和double型存储方式如图:


float内存存储


double内存存储


由此,我们也可以很清楚的看出来为什么float被称为单精度浮点型而double被称为双精度浮点型了,通过duoble通过增加内存长度为float的双倍,指数E和有效位数的长度也得到了提升(因为小数点之后的位数是由有效位以及指数共同决定的),从而成为了精度更高的双精度。


构造类型

数组类型:
元素类型 数组名[元素个数](初始化后元素个数可以不加)

结构体类型:
struct 结构体名(struct和结构体名共同构成了该结构体类型的类型名)
{
结构体成员类型 + 结构体成员名;
······
}

枚举类型:专门文章讲解

联合类型:专门文章讲解


指针类型

类型名*就是该类型的类型名,其中*起标记变量名为指针的作用,因此一次只会作用在一个变量上(一颗*只能标记一个变量,该变量之后接着定义的变量都会为该变量解引用之后得到的变量类型,也就是*前面的类型)


空类型

无类型,就是在一些在一些可以无需加具体类型定义的情况下使用的类型,如函数无参数就是无类型,函数无返回值也是无类型。其也有对应的指针类型——空指针(void*),作用主要是用来标记暂时没有赋有意义地址的指针,并防止其成为野指针。


字节序(数据在内存中存储的顺序)

高低字节位

一个数的高位与低位和这个数在内存中的高字节位与低字节位位置相同,只是转换成二进制码后将其高位上的前八位的数字,也就是在VS中看到的前两个16进制数字称作一个高字节位,低字节位的定义也是同理。

大小端

我们将高字节位的一端称作该二进制码的大端,低字节一端为小端,就有了大小端的定义,因此大小端的定义也只适用于单个数值的数据存储,而不适用于数组等结构类型的存储规律,这些类型较单个数字较为高级一些,都是由高级语言C语言本身的语法和其底层运行逻辑来决定的。

字节序

表示单个数值二进制码的存储顺序,内存中地址位是由低至高的,栈区中是有上堆积数据一直往上堆的,越往后(越靠进的是低地址)堆积的是小端就是小端字节序,越往后(越靠近堆积的方向即地址更低的方向)堆积的是大端就是大端字节序。
字节序

结语

以上就是对数据在内存中的存储的深度解析,😄希望对你的C语言学习有所帮助!作为刚学编程的小白,可能在一些设计逻辑方面有些不足,欢迎评论区进行指正!看都看到这了,点个小小的赞或者关注一下吧(当然三连也可以~),你的支持就是博主更新最大的动力!让我们一起成长,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/147215.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE | 初识Java(六) | 数组 (上)

数组的创建及初始化 T[] 数组名 new T[N]; //T:表示数组中存放元素的类型 //T[]:表示数组的类型 //N:表示数组的长度 int[] array1 new int[10]; // 创建一个可以容纳10个int类型元素的数组 double[] array2 new double[5]; // 创建一个可…

SDI-12协议与STM32 进行uart通信

场景是用stm32与一款温湿度传感器通信,不过是基于SDI-12协议,SDI-12时序和UART类似,故采用UART传输,原理图如下 其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR…

Redis是否要分库的实践

Redis的分库其实没有带来任何效率上的提升,只是提供了一个命名空间,而这个命名空间可以完全通过key的设计来避开这个问题。 一个优雅的Redis的key的设计如下

YoloV5实时推理最短的代码

YoloV5实时推理最简单代码 import cv2 import torch# 加载YOLOv5模型 model torch.hub.load(ultralytics/yolov5, yolov5s)# 使用CPU或GPU进行推理 device cuda if torch.cuda.is_available() else cpu model.to(device)# 打开摄像头(默认摄像头) cap…

适合在校学生的云服务器有哪些?

随着云计算技术的发展,越来越多的学生开始使用云服务器来进行学习和实践。对于学生来说,选择一款便宜的云服务器不仅可以帮助他们降低成本,还可以提高学习和实践的效率。本文将介绍几款适合学生使用的便宜云服务器。 1、腾讯云学生服务器【点…

<Xcode> Xcode IOS无开发者账号打包和分发

关于flutter我们前边聊到的初入门、数据解析、适配、安卓打包、ios端的开发和黑苹果环境部署,但是对于苹果的打包和分发,我只是给大家了一个链接,作为一个顶级好男人,我认为这样是对大家的不负责任,那么这篇就主要是针…

[论文必备]最强科研绘图分析工具Origin(1)——安装教程

之前在论文中pr曲线和loss曲线对比用到了Origin这个最强科研绘图分析工具,被导师狠狠夸了,下面来分享一下~ 本篇先带你手把手安装这个软件,可以先点再慢慢看哦~ 目录 📢一、软件简介 🌻二、安装教程 &#x1f384…

Docker命令起别名

1.打开.bashrc文件 vi ~/.bashrc 2. 起别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}" alias disdocker images 3. 文件生效 source ~/.bashrc 4.展示

CF505B Mr. Kitayuta‘s Colorful Graph

Mr. Kitayuta’s Colorful Graph 题面翻译 给出一个 n n n 个点, m m m 条边的无向图,每条边上是有颜色的。有 q q q 组询问 对于第 i i i 组询问,给出点对 u i , v i u_i,v_i ui​,vi​。求有多少种颜色 c c c 满足:有至…

在线OJ项目核心思路

文章目录 在线OJ项目核心思路1. 项目介绍2.预备知识理解多进程编程为啥采用多进程而不使用多线程?标准输入&标准输出&标准错误 3.项目实现题目API实现相关实体类定义新增/修改题目获取题目列表 编译运行编译运行流程 4.统一功能处理 在线OJ项目核心思路 1. 项目介绍 …

使用腾讯云服务器安装宝塔Linux面板教程_图文全流程

使用腾讯云服务器搭建网站全流程,包括轻量应用服务器和云服务器CVM建站教程,轻量可以使用应用镜像一键建站,云服务器CVM可以通过安装宝塔面板的方式来搭建网站,腾讯云服务器网分享使用腾讯云服务器建站教程,新手站长搭…

Linux基本指令(二)

💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 C👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大…

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…

YAMLException : java.nio.charset.MalformedInputException : Input length = 1

场景还原 有小伙伴反应SpringBoot项目启动异常,但是同组其他伙伴的无问题! ERROR org.springframework.boot.SpringApplication - Application run failedorg.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException : Inpu…

决策树C4.5算法的技术深度剖析、实战解读

目录 一、简介决策树(Decision Tree)例子: 信息熵(Information Entropy)与信息增益(Information Gain)例子: 信息增益比(Gain Ratio)例子: 二、算…

【初识Linux】上

初识Linux上 一、Linux背景1.1 UNIX发展的历史1.2 UNIX发展的历史 二、开源三、官网Linux官网 四、企业应用现状五、发行版本六、 os概念,定位 本博客简介 初始Linux操作系统初识shell命令 ,了解若干背景知识。使用常用Linux命令了解Linux权限概念与思想,能深度理解…

调用gethostbyname实现域名解析(附源码)

VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…

世界前沿技术发展报告2023《世界信息技术发展报告》(七)网络与信息安全技术

(七)网络与信息安全技术 1. 概述2. 网络安全关键技术2.1 美国特种作战司令部举办网络挑战赛以寻找边缘安全技术2.2 英国卡迪夫大学开发出在1秒内阻止网络攻击的方法2.3 国研究人员开发出检测恶意网页的新方法2.4 韩国仁川大学研发出一种基于5G的人工智能…

管道-有名管道

一、有名管道 有名管道与匿名管道的不同: 有名管道提供了一个路径名,并以FIFO的文件形式存在于文件系统中。与匿名管道不同,有名管道可以被不相关的进程使用,只要它们可以访问该路径,就能够通过有名管道进行通信。 FI…

IDEA中的神仙插件——Smart Input (自动切换输入法)

推荐专栏:开发环境配置攻略 致力于记录学习过程中各种软件的安装及环境配置操作,并提供详细的步骤说明和丰富的配图。涵盖了 Java、Python、IntelliJ IDEA、Tomcat、MySQL 等常见开发工具和服务器组件的配置,为初学者提供一个实用、全面的配置…