【C语言回顾】数据在内存中的存储

  • 前言
  • 1. 概述
  • 2. 大小端字节序和字节序判断
      • 2.1 大端字节序(Big-Endian)
      • 2.2 小端字节序(Little-Endian)
      • 2.3 判断字节序的示例
  • 3. 数据在内存中的存储
    • 3.1 整数在内存中的存储
    • 3.2 浮点数在内存中的存储
  • 结语

在这里插入图片描述
在这里插入图片描述


上期回顾: 【C语言回顾】字符函数、字符串函数,内存函数
个人主页:C_GUIQU
专栏:【C语言学习】

在这里插入图片描述

前言

各位小伙伴大家好!上期小编给大家讲解了C语言中的字符函数、字符串函数,内存函数,接下来我们讲解一下数据在内存中的存储!

在这里插入图片描述

1. 概述

在C语言中,数据在内存中的存储方式受到数据类型、对齐规则和编译器实现的影响。

以下是C语言中数据在内存中存储的一些关键点:

  1. 数据类型大小:C语言中的基本数据类型(如intcharfloatdouble等)在内存中占用的字节数是由编译器和目标系统架构决定的。例如,在32位系统中,int通常占用4个字节,float占用4个字节,而double占用8个字节。
  2. 内存对齐:为了提高内存访问效率,C语言在存储数据时通常会遵循特定的对齐规则。这些规则规定了数据应该从特定的地址开始存储。例如,一个4字节的整数可能会被要求从4的倍数地址开始存储。结构体中的成员也会根据这些规则进行对齐,这可能导致结构体实际占用的内存大小比各成员大小之和要大。
  3. 字节顺序:C语言中的数据在内存中的存储顺序可能因系统架构而异。在大端(Big-Endian)系统中,数据的最高有效字节存储在最低的内存地址,而在小端(Little-Endian)系统中,数据的最低有效字节存储在最低的内存地址。例如,整数0x12345678在大端系统中存储为12 34 56 78,而在小端系统中存储为78 56 34 12
  4. 堆和栈:在C语言中,动态分配的内存(使用malloccallocrealloc等函数)通常在堆(heap)上分配,而局部变量和函数调用的上下文信息通常在栈(stack)上分配。堆上的内存需要在不再需要时由程序员显式释放,而栈上的内存则会在函数调用结束后自动释放。
  5. 数组和指针:在C语言中,数组是一块连续的内存区域,其元素按照顺序存储。指针是一个变量,它存储了一个内存地址,可以通过指针来访问和修改内存中的数据。指针的大小通常与系统的地址总线宽度相等,在32位系统中为4字节,在64位系统中为8字节。
  6. 结构体和联合:结构体(struct)和联合(union)是C语言中用于创建复杂数据结构的关键字。结构体中的成员按照它们在结构体定义中的顺序存储在内存中,每个成员按照其对齐规则进行对齐。联合中的所有成员共享同一块内存区域,因此联合的大小是其最大成员的大小,并且对齐到最大成员的对齐要求。

了解C语言中数据在内存中的存储方式对于编写高效和正确的程序至关重要,尤其是在进行指针操作、内存管理、数据结构和网络编程时。

2. 大小端字节序和字节序判断

大小端字节序(Endianess)是指多字节数据在内存中的存储顺序。在不同的计算机体系结构中,多字节数据的存储顺序可能不同。以下是大小端字节序的定义和如何判断字节序的示例:

2.1 大端字节序(Big-Endian)

在大端字节序中,数据的最高有效字节(Most Significant Byte, MSB)存储在最小的内存地址中,而最低有效字节(Least Significant Byte, LSB)存储在最大的内存地址中。这类似于阅读和写入数字时的顺序,从最高位到最低位。
例如,一个16位的整数0x1234在大端字节序中的存储顺序如下:

地址增长方向 -->
[0x12] [0x34]
MSB     LSB

2.2 小端字节序(Little-Endian)

在小端字节序中,数据的最低有效字节(LSB)存储在最小的内存地址中,而最高有效字节(MSB)存储在最大的内存地址中。这与我们通常阅读数字的顺序相反。
例如,同样的16位整数0x1234在小端字节序中的存储顺序如下:

地址增长方向 -->
[0x34] [0x12]
LSB     MSB

2.3 判断字节序的示例

在C语言中,可以通过编写一个简单的程序来判断当前系统的字节序。以下是一个示例程序:

#include <stdio.h>
int main() {unsigned int num = 1;char *ptr = (char *)&num;if (*ptr == 1) {printf("小端字节序\n");} else {printf("大端字节序\n");}return 0;
}

这个程序创建了一个无符号整数num并将其初始化为1。然后,它将一个char类型的指针ptr指向这个整数。由于char类型通常是一个字节,所以ptr指向的是num的第一个字节。如果第一个字节是1,那么系统是小端字节序;如果第一个字节是0,那么系统是大端字节序。
运行这个程序,你将能够看到你的系统是使用大端还是小端字节序。

3. 数据在内存中的存储

3.1 整数在内存中的存储

整数在内存中的存储方式取决于整数的类型、大小以及计算机的体系结构(特别是字节序)。以下是一些关于整数在内存中存储的基本信息:

  1. 有符号与无符号整数
    • 有符号整数(例如 intshortlong)可以表示正数、负数和零。
    • 无符号整数(例如 unsigned intunsigned shortunsigned long)只能表示非负数(正数和零)。
  2. 原码、反码和补码
    • 有符号整数通常使用补码(two’s complement)形式存储在内存中。
    • 原码(sign-magnitude)直接将最高位用作符号位(0表示正,1表示负),其余位表示数值。
    • 反码(ones’ complement)在原码的基础上,将负数的所有位取反(符号位不变)。
    • 补码在反码的基础上加1。
  3. 字节序
    • 如前所述,整数在内存中的字节顺序取决于计算机的大小端字节序。
    • 在大端字节序中,整数的最高有效字节存储在最小的内存地址。
    • 在小端字节序中,整数的最低有效字节存储在最小的内存地址。
  4. 整数大小
    • int 类型的大小通常是平台相关的,通常为4字节(32位)或8字节(64位)。
    • short 通常为2字节(16位),而 longlong long 分别为4字节和8字节,或者更大。
  5. 示例
    • 假设我们有一个32位的有符号整数 int num = 12345,在小端字节序的系统中,它可能会按照以下方式存储:
      地址增长方向 -->
      [0x39] [0x30] [0x00] [0x00]
      LSB    ...
      
    • 如果 num 是一个负数,比如 -12345,在补码表示法下,它首先会被转换为补码,然后按照相同的字节顺序存储。
  6. 对齐要求
    • 整数在内存中的存储还可能受到对齐要求的限制,这意味着整数可能需要从特定地址开始存储,例如,一个4字节的整数可能需要从4的倍数地址开始存储。
      理解整数在内存中的存储方式对于编写高效和正确的程序至关重要,尤其是在进行位操作、网络编程、跨平台开发以及与硬件接口交互时。

3.2 浮点数在内存中的存储

浮点数在内存中的存储遵循特定的标准,最常见的是IEEE 754标准。这个标准定义了浮点数的存储格式,并且被大多数现代计算机系统所采用。以下是关于浮点数在内存中存储的一些关键点:

  1. IEEE 754标准
    • IEEE 754标准定义了单精度(32位)和双精度(64位)浮点数的格式。
    • 单精度浮点数(float)通常占用4个字节。
    • 双精度浮点数(double)通常占用8个字节。
  2. 浮点数的组成部分
    • 符号位(Sign bit):决定浮点数是正数(0)还是负数(1)。
    • 指数(Exponent):表示浮点数的数量级。
    • 尾数(Mantissa)或有效数字(Significand):表示浮点数的精确值。
  3. 单精度(float)存储格式
    • 符号位:1位
    • 指数:8位(偏移量编码)
    • 尾数:23位(隐藏的最高位通常不存储)
  4. 双精度(double)存储格式
    • 符号位:1位
    • 指数:11位(偏移量编码)
    • 尾数:52位(隐藏的最高位通常不存储)
  5. 特殊值
    • 零(0):所有位都是0。
    • 无穷大(Infinity):指数全为1,尾数全为0。
    • 非数(NaN,Not a Number):指数全为1,尾数不全为0。
  6. 字节顺序
    • 和整数一样,浮点数的字节顺序也取决于系统的大小端字节序。
  7. 示例
    • 假设我们有一个单精度浮点数 float f = 123.45,在小端字节序的系统中,它可能会按照以下方式存储:
      地址增长方向 -->
      [0x00] [0x00] [0x7A] [0x44]
      LSB    MSB
      

其中,0x44 是尾数的部分,0x7A 是指数和符号位的组合。
理解浮点数在内存中的存储方式对于编写科学计算、图形处理和需要高精度计算的程序非常重要。需要注意的是,浮点数的表示可能会有精度损失,特别是在进行大量计算时。因此,在设计算法和处理数据时,需要特别注意浮点数的特性和限制。

结语

以上就是小编对数据在内存中的存储的详细讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【小菜鸟之---Ansible基础详解】

文章目录 1 【Ansible简介】1.1简介1.2 Ansible 特点1.3 Ansible的工作机制1.4Ansible任务工作模式 2【安装部署】2.1安装命令2.2 Ansible配置文件2.3主机清单配置2.4 基于ssh免密登录2.5常用命令 3【Ansible常用模块】3.1 ping模块3.2 shell模块3.3 command模块3.4 copy模块3.…

webox微信群发器多少钱?电脑微信群发软件哪个好用?微信群发助手一次能发多少人?最强稳定群发器来袭

今天给大家推荐一款我们目前在使用的电脑群发工具WeBox&#xff0c;不仅可以无限多开&#xff0c;方便你同时管理多个账号&#xff0c;群发功能更是十分强大&#xff0c;轻松释放你的双手。 软件下载地址>>密码&#xff1a;4as1 WeBox群发功能 下载WeBox打开登录&#x…

Golang | Leetcode Golang题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; func climbStairs(n int) int {sqrt5 : math.Sqrt(5)pow1 : math.Pow((1sqrt5)/2, float64(n1))pow2 : math.Pow((1-sqrt5)/2, float64(n1))return int(math.Round((pow1 - pow2) / sqrt5)) }

《苍穹外卖》电商实战项目(java)知识点整理(P1~P65)【上】

史上最完整的《苍穹外卖》项目实操笔记&#xff0c;跟视频的每一P对应&#xff0c;全系列10万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 《苍穹外卖》项目实操笔记【中】&#xff1a;P66~P…

SiteServer 插件之 用户登录插件-用户注册

1、请确保已经安装了“用户登录插件”,如下图。 2、 显示管理->包含文件管理->include/header.html->编辑,如下图。 3、代码如下。 <header><div class="wrap"><div class="top-box clearfix"><div class="left-box…

cordova build android 下载gradle太慢

一、 在使用cordova run android / cordova build android 的时候 gradle在线下载 对于国内的链接地址下载太慢。 等待了很长时间之后还会报错。 默认第一次编译在线下载 gradle-7.6.1-all.zip 然后解压缩到 C:\Users\Administrator\.gradle 文件夹中,下载慢导致失败。 二…

前端工程化06-JavaScript模块化CommonJS规范ES Module

7、JavaScript模块化 在js开发中&#xff0c;他并没有拆分的概念&#xff0c;并不像java一样他可以拆分很多的包&#xff0c;很多的类&#xff0c;像搭积木一样完成一个大型项目的开发&#xff0c;所以js在前期的时候并不适合大型后端的项目开发&#xff0c;但是这些问题在后来…

CNN实现卫星图像分类(tensorflow)

使用的数据集卫星图像有两类&#xff0c;airplane和lake&#xff0c;每个类别样本量各700张&#xff0c;大小为256*256&#xff0c;RGB三通道彩色卫星影像。搭建深度卷积神经网络&#xff0c;实现卫星影像二分类。 数据链接百度网盘地址&#xff0c;提取码: cq47 1、查看tenso…

CentOS常用命令有哪些?

目录 一、CentOS常用命令有哪些&#xff1f; 二、不熟悉命令怎么办&#xff1f; 场景一&#xff1a;如果是文件操作&#xff0c;可以使用FileZilla工具来完成 场景二&#xff1a;安装CentOS桌面 一、CentOS常用命令有哪些&#xff1f; CentOS 系统中有许多常用命令及其用法…

leetcode尊享面试100题(549二叉树最长连续序列||,python)

题目不长&#xff0c;就是分析时间太久了。 思路使用dfs深度遍历&#xff0c;先想好这个函数返回什么&#xff0c;题目给出路径可以是子-父-子的路径&#xff0c;那么1-2-3可以&#xff0c;3-2-1也可以&#xff0c;那么考虑dfs返回两个值&#xff0c;对于当前节点node来说&…

JavaScript —— APIs(五)

一、Window对象 1. BOM&#xff08;浏览器对象模型&#xff09; 2. 定时器-延时函数 ①、定义 ②、定时器比较 ③、【案例】 3. JS执行机制 4. location对象 注意&#xff1a;hash应用 不点击页面刷新号&#xff0c;点击刷新按钮也可以实现页面刷新 【案例】 5. navig…

电机控制系列模块解析(16)—— 电流环

一、FOC为什么使用串联控制器 在此说明&#xff0c;串联形式&#xff08;内外环形式&#xff0c;速度环和电流环控制器串联&#xff09;并不是必须的&#xff0c;但是对于线性控制系统来说&#xff0c;电机属于非线性控制对象&#xff0c;早期工程师们为了处理电机的非线性&am…

【ARM】ARM寄存器和异常处理

1.指令的执行过程 &#xff08;1&#xff09;一条指令的执行分为三个阶段 1.取址&#xff1a; CPU将PC寄存器中的地址发送给内存&#xff0c;内存将其地址中对应的指令返回 到CPU中的指令寄存器&#xff08;IR&#xff09; 2.译码&#xff1a; 译码器对IR中的指令…

神经网络中的算法优化(皮毛讲解)

抛砖引玉 在深度学习中&#xff0c;优化算法是训练神经网络时至关重要的一部分。 优化算法的目标是最小化&#xff08;或最大化&#xff09;一个损失函数&#xff0c;通常通过调整神经网络的参数来实现。 这个过程可以通过梯度下降法来完成&#xff0c;其中梯度指的是损失函数…

Grafana:云原生时代的数据可视化与监控王者

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Grafana&#xff1a;让数据说话的魔术师》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Grafana简介 2、Grafana的重要性与影响力 …

全方位了解 Meta Llama 3

本文将为您提供 Llama 3 的全面概览&#xff0c;从其架构、性能到未来的发展方向&#xff0c;让您一文了解这一革命性大语言模型的所有要点。 Meta Llama 发展历程 Llama 1 Llama 是由 Meta(FaceBook) AI 发布的一个开源项目&#xff0c;允许商用&#xff0c;影响力巨大。Lla…

力扣每日一题111:二叉树的最小深度

题目 简单 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#x…

C语言:文件操作(上)

片头 嗨&#xff01;小伙伴们&#xff0c;今天我们来学习新的知识----文件操作&#xff0c;准备好了吗&#xff1f;我要开始咯! 目录 1. 为什么使用文件&#xff1f; 2. 什么是文件&#xff1f; 3. 二进制文件和文本文件&#xff1f; 4. 文件的打开和关闭 5. 文件顺序读写…

启发式算法解魔方——python

未完待续&#xff0c;填坑ing…… 魔方操作的表示——辛马斯特标记 辛马斯特标记&#xff08;Singmaster Notation&#xff09;是一种用于描述魔方和类似拼图的转动操作的标记系统。它以大卫辛马斯特&#xff08;David Singmaster&#xff09;的名字命名&#xff0c;辛马斯特…

C 认识指针

目录 一、取地址操作符&#xff08;&&#xff09; 二、解引用操作符&#xff08;*&#xff09; 三、指针变量 1、 指针变量的大小 2、 指针变量类型的意义 2.1 指针的解引用 2.2 指针 - 整数 2.3 调试解决疑惑 认识指针&#xff0c;指针比较害羞内敛&#xff0c;我们…