【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.rhkb.cn/news/319903.html

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

相关文章

Coursera: An Introduction to American Law 学习笔记 Week 05: Criminal Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 05: Criminal LawKey Criminal Law TermsSupplemental Re…

【Python项目】基于opencv的的【疲劳检测系统】

技术简介&#xff1a;使用Python技术、OpenCV图像处理库、MYSQL数据库等实现。 系统简介&#xff1a;用户可以通过登录系统平台实现实时的人脸照片的拍摄和上传&#xff0c;结合上传图像的内容进行后台的图像预处理和运算分析&#xff0c;用户可以通过照片分析界面查看到当前检…

企业计算机服务器中了rmallox勒索病毒怎么处理,rmallox勒索病毒解密恢复

网络在为企业提供便利的同时&#xff0c;也为企业的数据安全带来严重威胁。随着网络技术的不断发展&#xff0c;越来越多的企业利用网络开展各项工作业务&#xff0c;网络数据安全问题&#xff0c;一直成为企业关心的主要话题&#xff0c;但网络威胁随着网络技术的不断成熟&…

OpenCV如何模板匹配(59)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现背投(58) 下一篇 &#xff1a;OpenCV在图像中寻找轮廓(60) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入…

第 129 场 LeetCode 双周赛题解

A 构造相同颜色的正方形 枚举&#xff1a;枚举每个 3 3 3\times 3 33的矩阵&#xff0c;判断是否满足条件 class Solution {public:bool canMakeSquare(vector<vector<char>>& grid) {for (int i 0; i < 2; i)for (int j 0; j < 2; j) {int c1 0, c…

Spring Cloud架构进化实操:Eureka、Apollo、OpenFeign、Ribbon、Zuul组件

文章目录 前言一、引出二、服务注册与发现2.1 创建Eureka注册中心2.1.1 引入pom依赖2.1.2 配置yaml2.1.3 启动服务21.4 测试访问 2.2 创建服务提供者2.2.1 配置yaml2.2.2 启动服务2.2.3 测试访问 2.3 创建服务消费者2.3.1 服务提供者接口2.3.2 服务消费者调用接口 三、负载均衡…

在GPU上加速RWKV6模型的Linear Attention计算

精简版&#xff1a;经过一些profile发现flash-linear-attention中的rwkv6 linear attention算子的表现比RWKV-CUDA中的实现性能还要更好&#xff0c;然后也看到了继续优化triton版本kernel的线索。接着还分析了一下rwkv6 cuda kernel的几次开发迭代以此说明对于不懂cuda以及平时…

LLVM Instruction Selection 笔记

Instruction Selection 所处阶段 注&#xff1a;上图来源于 Welcome to the back-end: The LLVM machine representation 可以看到 SelectionDAG 架在 LLVM IR 和 LLVM MIR 之间&#xff0c;在此之前 machine independent optimization 已经完成。之后基本上就进入了 machine …

学习3:scrapy请求对象、模拟登录、POST请求、管道的使用、crawlspider爬虫类

请求对象 请求对象参数 scrapy.Request(url[],callback,method"GET",headers,body,cookies,meta,dont_filterFalse)callback 表示当前的url响应交给那个函数去处理method 指定请求方式headers 接受一个字典&#xff0c;其中不包括cookiesbody 接收json字符串&#…

原来spring也可以AI

最近大模型是相当的火&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;、图像识别、语音识别等领域的应用&#xff0c;那对于工程同学来说应该如何接住这波破天的富贵呢&#xff1f; 想啥来啥&#xff0c;前段时间LangChain给我们整了一套钢铁战甲&#xff0c;让…

javascript 练习 写一个简单 另类录入 电脑组装报价表 可打印

数据格式 &#xff08;1代表cpu、2代表主板、3代表内存、。。。&#xff09; 1i3 12100 630 2H610 480 3DDR4 3200 16G 220 4500G M.2 299 5300W电源 150 6小机箱 85 7GT 730G 4G 350 8WD 2T 399 9飞利浦 24Led 580 主代码 Html JS <!DOCTYPE html> <html lang&qu…

tomcat+maven+java+mysql图书管理系统1-配置项目环境

目录 一、软件版本 二、具体步骤 一、软件版本 idea2022.2.1 maven是idea自带不用另外下载 tomcat8.5.99 Javajdk17 二、具体步骤 1.新建项目 稍等一会&#xff0c;创建成功如下图所示&#xff0c;主要看左方目录相同不。 给maven配置国外镜像 在左上…

【通信中间件】Fdbus HelloWorld实例

Fdbus实例教程 Fdbus简介 Fdbus 全称 Fast Distributed Bus&#xff08;高速分布式总线&#xff09;&#xff0c;提供IPCRPC功能。适用于多种OS&#xff1a; LinuxQNXAnroidOSWindow Fdbus本质是Socket&#xff0c;IPC基于Unix domain socket&#xff0c;RPC基于TCP。使用G…

【数据结构初阶】直接插入排序

最近浅学了直接插入排序&#xff0c;写个博客做笔记&#xff01;笔记功能除外若能对读者老爷有所帮助最好不过了&#xff01; 直接插入排序是插入排序的一种&#xff0c;那么介绍直接插入排序之前先介绍一下常见的排序算法&#xff01; 目录 1.常见的排序算法 2.直接插入排…

详解LLMOps,将DevOps用于大语言模型开发

大家好&#xff0c;在机器学习领域&#xff0c;随着技术的不断发展&#xff0c;将大型语言模型&#xff08;LLMs&#xff09;集成到商业产品中已成为一种趋势&#xff0c;同时也带来了许多挑战。为了有效应对这些挑战&#xff0c;数据科学家们转向了一种新型的DevOps实践LLM-OP…

FFmpeg学习记录(四)——SDL音视频渲染实战

1.SDL使用的基本步骤 SDL Init/sDL _Quit()SDL_CreateWindow()/SDL_DestoryWindow()SDL CreateRender() SDL_Windows *windows NULL;SDL_Init(SDL_INIT_VIDEO);window SDL_CreateWindow("SDL2 Windows",200,200, 640,480,SDL_WINDOW_SHOWN);if(!window) {printf(&…

QtWindows任务栏

目录 引言任务栏进度右键菜单缩略图工具栏完整代码 引言 针对Windows系统的任务栏&#xff0c;Qt基于系统的原生接口封装有一些非常见类&#xff0c;如QWinTaskbarButton、QWinTaskbarButton、QWinThumbnailToolBar等&#xff0c;用于利用工具栏提供更多的信息&#xff0c;诸如…

C 认识指针

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

使用jdbc方式操作ClickHouse

1、创建测试表&#xff0c;和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

ctfshow 框架复现

文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 &#xff0c;提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…