【C语言进阶】数据如何安家?C语言内存中的存储艺术深度解析

news2024/11/26 16:26:35

📝个人主页🌹:Eternity._
⏩收录专栏⏪:C语言 “ 登神长阶 ”
🤡往期回顾🤡:C语言调试
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述

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

❀C语言数据在内存中的存储

  • 📒1. 数据类型介绍
    • 🍁类型的基本归类
  • 📚2. 整型在内存中的存储
    • 🌄原码、反码、补码
    • 🏞️大小端字节序
    • ⛰️判断机器字节序的方法
  • 📜3. 浮点型在内存中的存储
    • 🎈分析一段代码
    • 🎩浮点数存储规则
  • 📖4. 总结


前言:在当今这个数据驱动的世界里,无论是软件开发、系统编程还是嵌入式系统开发,对数据的处理与存储都占据着举足轻重的地位。C语言,作为一门历史悠久且功能强大的编程语言,其直接操作内存的能力使得它在处理复杂数据结构和高性能数据存储方面展现出独特的优势。因此,深入理解C语言中的数据存储机制,对于任何希望成为高效程序员或系统分析师的学习者而言,都是不可或缺的一步

本文旨在为读者揭开C语言数据存储的神秘面纱,从最基本的变量类型与内存分配讲起,我们将通过理论讲解与实例演示相结合的方式,帮助读者构建扎实的C语言数据存储知识体系,掌握如何在C语言中高效、安全地处理各种类型的数据

让我们一同踏上这段探索C语言数据存储奥秘的旅程,开启编程世界的新篇章!


📒1. 数据类型介绍

// 基本的内置类型
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数

类型的意义:

  • 使用这个类型开辟内存空间的大小(大小决定了使用范围)
  • 如何看待内存空间的视角

🍁类型的基本归类

基本数据类型是C语言中最基础、最直接由语言本身支持的数据类型,它们是所有复杂数据类型和程序的基础

⭐整形家族:

char
	unsigned char
	signed char
short
	unsigned short [int]
	signed short [int]
int
	unsigned int
	signed int
long
	unsigned long [int]
	signed long [int]

⭐浮点数家族:

float
double

⭐构造类型:

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

⭐指针类型

int *pi;
char *pc;
float* pf;
void* pv;

⭐空类型:

  • void 表示空类型(无类型)
  • 通常应用于函数的返回类型、函数的参数、指针类型

📚2. 整型在内存中的存储

整型在内存中的存储涉及多个方面,包括整数的表示方法(原码、反码、补码)、大小端字节序等


🌄原码、反码、补码

  • 原码: 直接将二进制按照正负数的形式翻译成二进制就可以
  • 反码: 将原码的符号位不变,其他位依次按位取反就可以得到了
  • 补码: 反码+1就得到补码
  • 正数的原码、反码、补码相同;负数的原码是符号位为1,其余各位为该数绝对值的二进制表示
  • 三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位
    正数的原、反、补码都相同
  • 计算机系统中,数值一律用补码来表示和存储。这是因为使用补码可以将符号位和数值位统一处理,同时加法和减法也可以统一,CPU只有加法器

在这里插入图片描述
我们可以通过编译器来查看数据的存储,但是存储顺序似乎和我们料想的不一样,它不是按我们正常的读写顺序


🏞️大小端字节序

概念:

  • 大端存储模式:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中
  • 小端存储模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中

意义:

大小端存储模式主要是为了解决多字节存储安排问题。在计算机系统中,我们通常是以字节为单位存储数据的,每个地址对应一个字节。但是,对于位数大于8位的处理器(如16位或32位处理器),由于寄存器宽度大于一个字节,因此存在如何将多个字节安排的问题,这就导致了大小端存储模式的诞生

例如:我们有一个16位的整数0x1234 ,那么 0x12 为高字节, 0x34 为低字节。需要将其存储到内存中。大端模式,刚好相反,在小端存储模式下,这个数的存储方式如下:

内存地址存储内容(十六进制)存储内容(二进制)
低地址0x340011 0100
高地址0x120001 0010

在这个例子中,0x34是0x1234的低位字节,它被存储在内存的低地址处;而0x12是0x1234的高位字节,它被存储在内存的高地址处


⛰️判断机器字节序的方法

这里我们介绍两种判断机器字节序的方法

//代码1 -> 通过类型的特点
#include <stdio.h>
int check_sys()
{
	int i = 1;
	return (*(char*)&i);
}

//代码2 -> 通过联合体
int check_sys()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

代码一:
在这里插入图片描述
代码二:
在这里插入图片描述


📜3. 浮点型在内存中的存储

浮点型在内存中的存储主要遵循IEEE 754标准,该标准定义了浮点数的表示和运算规则。浮点型数据在内存中的存储结构通常分为单精度(32位)和双精度(64位)两种格式


🎈分析一段代码

在这里插入图片描述

先思考这段代码输出的值;
我想很多人应该会觉得输出值无非就是 9 或 9.0
但结果真的是这样吗?

在这里插入图片描述
我想这个结果肯定会让人大吃一惊,让我们来分析分析为什么这样输出


🎩浮点数存储规则

⭐国际标准IEEE 754
要搞懂上面的代码就必须要了解浮点数在计算机内的存储规则。

根据国际标准IEEE(电气和电子工程协会) 754,
任意一个二进制浮点数V可以表示成下面的形式:

● (-1)^S * M * 2^E
● (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
● M表示有效数字,大于等于1,小于2。
● 2^E表示指数位。

在这里插入图片描述

在这里插入图片描述

也就是说:

十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上面V的格式,可以得出S=0,M=1.01,E=2。
十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。
那么,S=1,M=1.01,E=2。
然后根据国际标准IEEE 754规定:

对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
在这里插入图片描述

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。在这里插入图片描述

IEEE 754对有效数字M和指数E,还有一些特别规定。
1≤M<2 ,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。
一般在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,
保存1.01的时候,只保存01。

在这里插入图片描述

在这里插入图片描述

⭐关于指数E
(1) E为一个无符号整数
如果E为8位,它的取值范围为0-255;
如果E为11位,它的取值范围为0-2047。
科学计数法中的E是可以出现负数的,
所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,

对于8位的E,这个中间数是127;
对于11位的E,这个中间数是1023。
比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即
10001001。

⭐E不全为0或不全为1
浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
比如:
0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为
1.0*2^(-1),其阶码为-1+127=126,表示为
01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:
在这里插入图片描述

⭐E全为0
浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于
0的很小的数字。

⭐E全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);


说了这么多回到开始我们就可以明白了
int n = 9;
float* pFloat = (float*)&n;

我们直接列出9的原 ,反 , 补码
00000000000000000000000000001001
00000000000000000000000000001001
00000000000000000000000000001001

由于是按%f去输出所以:

0 00000000 00000000000000000001001
E=1-127=-126
M=00000000000000000001001

所以结果为:
在这里插入图片描述

显然所得的值是一个很小的接近于0的正数,所以用十进制小数表示就是0.000000。
而后面的,
*pFloat = 9.0;

1001.0
S=0;
E=2^3;
M=1.001

所以在这里9.0的补码就大不相同了
E=3+127

9.0补码
0 10000010 00100000000000000000000

在这里插入图片描述


📖4. 总结

在深入剖析C语言中数据在内存中的存储这一漫长而精妙的旅程即将画上句号之际,我们不禁为这一编程语言所展现出的底层魅力和强大能力所折服。C语言,作为计算机科学领域的基石之一,其直接操作内存的能力不仅赋予了程序员前所未有的灵活性和控制权,也要求我们必须对数据的存储细节有着深刻的理解

通过本文的探讨,我们揭示了整型、浮点型、字符型等基本数据类型在内存中的布局与表示方式,理解了大小端字节序对数据存储顺序的影响

然而,这只是冰山一角。C语言中的数据存储与内存管理远不止于此。随着对C语言深入学习的推进,我们还将面临更多挑战与机遇,比如动态内存分配与释放、内存泄漏的检测与预防、缓冲区溢出的防范等。这些高级话题不仅要求我们具备扎实的理论基础,更需要我们在实践中不断摸索与总结,形成一套行之有效的编程习惯与技巧

在这里插入图片描述
希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!

在这里插入图片描述

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

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

相关文章

如何应对突发技术故障和危机:开发团队的应急策略

开发团队如何应对突发的技术故障和危机&#xff1f; 在数字化时代&#xff0c;软件服务的稳定性对于企业至关重要。然而&#xff0c;即使是大型平台&#xff0c;如网易云音乐&#xff0c;也可能遇到突发的技术故障。网页端出现502 Bad Gateway 报错&#xff0c;且App也无法正常…

云计算day30

1. 配置⼀主⼆从mysql57 1. mycat对mysql8不完全⽀持 2. mysql8主从问题不⼤ get_pub_key1 1. gtids事务复制 2. 删除/etc/my.cnf 3. 同步data⽂件需要先停⽤mysql服务&#xff0c;删除data⽬录中的 auto.cnf 4. gtid模式以及经典模式都需要锁表 flush tables with rea…

6 - Linux PXE高效批量网络装机

目录 一、PXE概述 1.简介 2.优点 3.前提条件 二、搭建PXE远程安装服务器 三、实现Kickstart无人值守安装 一、PXE概述 1.简介 PXE&#xff08;Preboot eXcution Environment&#xff09;预启动执行环境&#xff0c;是由Intel公司开发的网络引导技术&#xff0c;工作在Cl…

工业4G路由器

设备概述 路由器是基于4G 技术研发的无线路由网关设备&#xff0c;除了具备传统路由器 的 VPN 、防火墙、 NAT 、 PPPoE 、 DHCP 等功能之外&#xff0c;还能支持 4G 无线拨号&#xff0c;提供最高可达 150Mbps 的无线高速带宽。路由器支持四个以太网接口&#xff0c;可更好…

招募活动投稿展示 | 感受科技温度,从一个 LLM 应用开始

活动介绍 谷歌开发者招募活动是专为 Google 技术的爱好者及开发者们开展的活动&#xff0c;旨在鼓励大家通过多种形式 (文章/视频/coding 等) 创作与 Google 技术相关的讲解分享、实践案例或活动感受等内容&#xff0c;展示代码、框架、平台在真实世界中的生动表现&#xff0c;…

【Win开发环境搭建】Redis与可视化工具详细安装与配置过程

&#x1f3af;导读&#xff1a;本文档提供了Redis的简介、安装指南、配置教程及常见操作方法。包括了安装包的选择与配置环境变量的过程&#xff0c;详细说明了如何通过修改配置文件来设置密码和端口等内容。同时&#xff0c;文档还介绍了如何使用命令行工具连接Redis&#xff…

商品数据获取api接口:电商API接口助力内部平台商品定价!

对于很多电商内部平台来讲&#xff0c;品牌方在为内部平台的商品定价时&#xff0c;通常会获取主流电商平台的商品数据以供参考&#xff0c;具体来看&#xff0c;这主要涉及以下步骤&#xff1a; 选择合适的API接口服务商。电商API接口能够提供来自多个主流电商平台的商品数据…

06--kubernetes.pod管理与投射数据卷

前言&#xff1a;上一章记录了部署k8s常用的两个方式&#xff0c;这一章就简单一些&#xff0c;整理一下k8s资源对象的配置和管理命令。 1、集群状态检查 前天搭建的环境&#xff0c;然后关机了两天今天开启后第一时间需要检查集群环境是否正常 [rootk8s-master1 ~]# kubect…

【html+css 绚丽Loading】000012 五行伸缩杖

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

js禁用浏览器缩放

禁用crtl- &#xff0c;禁用crtl滚轮 但是不能禁用浏览器本身的设置 代码如下&#xff1a; <script> //luwenjie hualunwindow.addEventListener(mousewheel, function(event){if (event.ctrlKey true || event.metaKey) {event.preventDefault();}},{ passive: fals…

数学建模算法总结

数学建模常见算法总结 评价决策类模型 层次分析法 层次分析法根据问题的性质和要达到的总目的&#xff0c;将问题分解为不同的组成因素&#xff0c;并按照因素间的相互关联影响以及隶属关系将因素按不同层次聚集组合&#xff0c;形成一个多层次的分析结构模型&#xff0c;从…

Go 文件操作基本方法大全

前言 在Go语言中&#xff0c;操作文件主要依赖于标准库中的os和io/ioutil&#xff08;注意&#xff1a;io/ioutil在Go 1.16及以后版本中被逐步弃用&#xff0c;推荐使用io和os包中的函数进行替代&#xff09;以及io和bufio等包。以下是一些基于这些基本库操作文件的方法大全&a…

人工智能时代:哪些职业将被取代,哪些职业难以替代?

引言 人工智能&#xff08;AI&#xff09;作为现代科技领域最引人瞩目的创新之一&#xff0c;正以前所未有的速度改变着我们的生活和工作方式。从20世纪50年代AI概念的诞生&#xff0c;到21世纪初的机器学习突破&#xff0c;再到如今深度学习与大数据的结合&#xff0c;人工智能…

记一次在工作中发现的Esper引擎底层逻辑问题

一、问题描述 在最近工作过程中本人遇到客户反馈一个问题&#xff1a;在某SOC平台关联分析规则新建的规则语句能查询到相关日志&#xff0c;但无法触发规则告警。 规则语句大致为&#xff1a; 数据源 "IPS" and not 目的地址 belong 白名单 客户需求是对于IPS告警…

Arduino复制的方法快速搭建ESP32低版本2.0.10开发环境

Arduino复制的方法快速搭建ESP32低版本2.0.10开发环境 1.概述 这篇文章介绍如何使用复制安装包的方式快速搭建好ESP32开发环境&#xff0c;而且是指定的2.0.10低版本。 2.搭建开发环境 1.下载安装包 首先在百度网盘下载ESP32安装包 通过百度网盘分享的文件&#xff1a;esp…

Biomamba教程01-绪论

目录 1、课程目录 2、单细胞技术背景 3、单细胞数据挖掘平台&#xff08;不用代码&#xff09; 1、课程目录 重点是寻找差异基因&#xff0c;进一步用KEGG、GO等进行疾病相关分析 2、单细胞技术背景 3、单细胞数据挖掘平台&#xff08;不用代码&#xff09; loupe.10xgenom…

会话跟踪方案:Cookie Session Token

什么是会话技术&#xff1f; Cookie 以登录为例&#xff0c;用户在浏览器中将账号密码输入并勾选自动登录&#xff0c;浏览器发送请求&#xff0c;请求头中设置Cookie&#xff1a;userName:张三 ,password:1234aa &#xff0c;若登录成功&#xff0c;服务器将这个cookie保存…

「Python程序设计」基础语法:程序的注释、行与缩进

在我们编写程序代码的过程中&#xff0c;加入程序的注释&#xff0c;是一个很重要的过程。特别是对于软件工程来说&#xff0c;加入程序的注释&#xff0c;可以提高程序代码的可读性&#xff0c;让程序的维护难度降低。 程序注释的种类 首先要知道的是&#xff0c;程序的注释…

为什么要用云手机进行海外社交营销

随着科技的飞速发展&#xff0c;云手机这一新兴技术正逐渐在海外社交营销中占据一席之地。云手机的灵活性、成本效益和全球化特点使其成为海外社交营销中不可或缺的工具。本文将深入剖析云手机的优势&#xff0c;并探讨其在海外社交营销中的重要作用。 首先&#xff0c;云手机的…

Admin.NET源码学习(3:LazyCaptcha使用浅析)

Admin.NET项目前端登录页面的验证码图片默认使用动态图&#xff0c;且图形内容为阿拉伯数字运算&#xff08;如下图所示&#xff09;&#xff0c;用户输入正确的计算结果才能正常登录。项目采用LazyCaptcha模块生成验证码及动态图。   在Admin.NET.Core项目中添加了Lazy.Cap…