高阶C语言|深度剖析数据在内存中的存储

文章目录

      • 重点
      • 1. 数据类型介绍
        • 1.1 数据类型的基本分类
      • 2. 整型在内存中的存储
        • 2.1 原码、反码、补码
        • 2.2 大小端字节序
        • 2.3 判断字节序
      • 3. 浮点型在内存中的存储
        • 3.1 IEEE 754 浮点数标准
        • 3.2 浮点数与整数的内存存储差异
        • 3.3 浮点数存储示例
      • 4. 实战练习
      • 总结

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习!

👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对数据存储感兴趣的朋友!

重点

  1. 数据类型详细介绍
  2. 整型在内存中的存储:原码、反码、补码
  3. 大小端字节序介绍及判断
  4. 浮点型在内存中的存储解析

1. 数据类型介绍

在计算机程序中,数据类型不仅决定了变量存储数据的方式,还决定了如何高效地处理这些数据。每种数据类型都有其特定的内存分配规则、范围和使用场景。理解数据类型的基本分类是学习内存存储的第一步。

1.1 数据类型的基本分类
  • 整型家族:用于表示整数值。

    • char:字符类型,通常占 1 字节。用于表示字符或小范围整数。
    • short:短整型,占 2 字节,范围通常为 -32,768 到 32,767。
    • int:整型,占 4 字节,范围通常为 -2,147,483,648 到 2,147,483,647。
    • long:长整型,占 4 或 8 字节(平台依赖),在 64 位系统中通常为 8 字节。
    • long long:更长的整型,占 8 字节,适用于存储更大的整数。
  • 浮点型家族:用于表示带小数点的数字,适用于处理实数。

    • float:单精度浮点数,占 4 字节,提供大约 6 位有效数字的精度。
    • double:双精度浮点数,占 8 字节,提供大约 15 位有效数字的精度。
    • long double:扩展精度浮点数,占 12 或 16 字节,具体取决于平台,提供更高精度。
  • 其他类型

    • void:空类型,用于表示函数的返回类型或无类型的指针。
    • 指针类型:用于存储变量的地址,常见类型有 int*char*float* 等。

这些数据类型的选择不仅影响变量占用的内存大小,还影响程序的性能和计算精度。熟悉不同类型的内存存储规则是理解程序如何高效运行的基础。


2. 整型在内存中的存储

计算机内存以二进制的方式存储数据,整型(如 intshort 等)采用不同的编码方式来表示数值。常见的表示方法有 原码反码补码

2.1 原码、反码、补码
  • 原码:直接将数值按符号位和数值位转换成二进制。对于负数,符号位为 1,正数的符号位为 0

  • 反码:对原码中的数值位取反,符号位不变。反码的主要用途是对负数进行运算。

  • 补码:反码加 1,计算机使用补码来表示负数。补码的使用使得加法器能够统一处理正负数的加法,简化了硬件设计。

在计算机内存中,整数通常以补码形式存储,因为补码运算能够简化加减运算,同时避免了负数处理的复杂性。通过补码,可以实现更高效的运算,并且不需要额外的硬件支持。

2.2 大小端字节序

计算机存储数据时,字节的排列顺序并非一成不变。根据字节存储的高低位顺序,计算机系统有两种常见的字节序:大端字节序小端字节序

  • 大端字节序(Big-endian):将数据的高位字节存储在内存的低地址处,低位字节存储在高地址处。例如,对于一个 32 位的整数 0x11223344,大端存储方式将其存储为:

    地址:0x00  0x01  0x02  0x03  
    数据:  0x11  0x22  0x33  0x44
    
  • 小端字节序(Little-endian):将数据的低位字节存储在内存的低地址处,高位字节存储在高地址处。例如,同样是 0x11223344,小端存储方式将其存储为:

    地址:0x00  0x01  0x02  0x03  
    数据:  0x44  0x33  0x22  0x11
    

不同的计算机体系结构可能采用不同的字节序。例如,x86 架构采用小端字节序,而某些老式的 RISC 架构或网络协议则使用大端字节序。

2.3 判断字节序

以下是一个简单的 C 程序,可以判断当前系统使用的是大端字节序还是小端字节序:

#include <stdio.h>

int check_endian() {
    int num = 1;
    return (*(char *)&num == 1);
}

int main() {
    if (check_endian()) {
        printf("小端字节序\n");
    } else {
        printf("大端字节序\n");
    }
    return 0;
}

该程序通过查看整数 1 在内存中的存储情况来判断字节序。如果 1 的最低有效字节(LSB)存储在低地址,则为小端字节序,否则为大端字节序。


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

浮点数用于表示实数(带小数的数字),在计算机内部采用 IEEE 754 标准 进行存储。该标准规定了浮点数如何用二进制表示,包括符号位、指数位和尾数部分。

3.1 IEEE 754 浮点数标准

浮点数的表示形式为:
[
(-1)^S \times M \times 2^E
]
其中:

  • S:符号位,0 表示正数,1 表示负数。
  • M:尾数(有效数字),大于等于 1 小于 2。
  • E:指数,表示数据需要乘以 2 的多少次方。

对于 32 位的单精度浮点数:

  • 符号位:1 位
  • 指数位:8 位(无符号整数,使用偏移量 127)
  • 尾数位:23 位(有效数字,去除前导 1)

对于 64 位的双精度浮点数:

  • 符号位:1 位
  • 指数位:11 位(使用偏移量 1023)
  • 尾数位:52 位

浮点数的精度和范围受限于其表示位数。由于尾数部分只能表示有限的有效数字,因此浮点数在计算时可能会出现舍入误差。

3.2 浮点数与整数的内存存储差异

浮点数和整数在内存中的存储方式不同,可能导致同一段内存数据被不同类型解读时出现巨大差异。例如:

int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n", n);          // 输出:9
printf("*pFloat的值为:%f\n", *pFloat);  // 输出:9.000000

在内存中,整数和浮点数使用不同的格式存储,导致相同的内存内容可能被解读为不同的数值。

3.3 浮点数存储示例

以浮点数 9.0 为例,它在 IEEE 754 单精度浮点数格式中的存储过程如下:

  1. 9.0 转化为二进制表示:1001.0,即 1.001 × 2^3
  2. 符号位:S = 0(正数)
  3. 指数位:E = 3 + 127 = 130(偏移量 127)
  4. 尾数位:M = 00100000000000000000000(去除前导 1,保留 23 位)

因此,9.0 在内存中的 32 位表示为:

符号位 | 指数位 | 尾数位
0      | 10000010 | 00100000000000000000000

通过这种方式,计算机可以

在内存中高效存储浮点数。


4. 实战练习

通过实际编程练习,可以加深对内存存储原理的理解:

  1. 练习1:打印 char 类型的溢出情况,观察 char 类型从 -128127 的范围如何影响存储。
  2. 练习2:手动实现整数到二进制(补码)的转换,并观察不同符号的存储效果。
  3. 练习3:在小端和大端机器上分别存储 intfloat 类型的变量,查看它们在内存中的表现。
  4. 练习4:使用位运算检查浮点数的存储结构,深入理解其表示方式。

总结

通过对数据类型、整数和浮点数在内存中存储方式的深入理解,可以更清楚地看到计算机如何高效地处理不同类型的数据。掌握补码、大端字节序、浮点数表示等基本概念,将有助于我们在编程中避免潜在的错误和性能瓶颈。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Artificial Intelligence篇】AI 携手人类:共铸未来创作新纪元

引言&#xff1a; 随着科技的飞速发展&#xff0c;人工智能已逐渐渗透到各个领域&#xff0c;尤其是在创作领域&#xff0c;其与人类的合作展现出了前所未有的可能性和潜力。从艺术作品的生成到文学作品的创作&#xff0c;从复杂软件的开发到创新设计的构思&#xff0c;AI 正在…

Easy-Trans反向翻译+Excel导入最佳实践

1、概述 实现用户excel上传、解析、对于用户输入的中文翻译为字典码或者id&#xff0c;实现用户输入的参数校验&#xff0c;最后入库。如果用户输入的参数有问题&#xff0c;返回校验结果给前端。 excel解析使用My-Excel组件&#xff0c;校验使用hibernate-validator&#xff…

OpenCV-Python实战(6)——图相运算

一、加法运算 1.1 cv2.add() res cv2.add(img1,img2,dstNone,maskNone,dtypeNone) img1、img2&#xff1a;要 add 的图像对象。&#xff08;shape必须相同&#xff09; mask&#xff1a;图像掩膜。灰度图&#xff08;维度为2&#xff09;。 dtype&#xff1a;图像数据类型…

Leetcode打卡:查询数组中元素出现的位置

执行结果&#xff1a;通过 题目 3159 查询数组中元素出现的位置 给你一个整数数组 nums &#xff0c;一个整数数组 queries 和一个整数 x 。 对于每个查询 queries[i] &#xff0c;你需要找到 nums 中第 queries[i] 个 x 的位置&#xff0c;并返回它的下标。如果数组中 x 的出…

向量组学习

向量组的秩及其线性组合 线性相关性 先看a1,a2 如果这两个向量不对应成比例的话,那必然内部不可能存在多余的向量,也就是无关. 主元所在的列都是独立向量 ,最大无关组就是b1,b2,b4,但这个是初等行变换后的,题目要的是A的,与之对应的就是a1,a2,a4 方程组解的结构

影视仓最新接口+内置本包方法的研究(2024.12.27)

近日喜欢上了研究影视的本地仓库内置&#xff0c;也做了一个分享到了群里。 内置本地仓库包的好处很明显&#xff0c;当前线路接口都是依赖网络上的代码站存放&#xff0c;如果维护者删除那就GG。 虽然有高手制作了很多本地包&#xff0c;但推送本地包到APP&#xff0c;难倒一片…

redis相关数据类型介绍

当然&#xff0c;Redis 作为一个高性能的键值存储系统&#xff0c;提供了多种数据类型来支持不同的应用场景。 1. String&#xff08;字符串&#xff09; • 定义&#xff1a;Redis 最基本的数据类型&#xff0c;用于存储字符串值。 • 操作&#xff1a;SET、GET、INCR、DECR、…

教师管理系统

大概功能&#xff1a; 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名&#xff1a;必须是中文 手机号码&#xff1a;必须是11位&#xff0c;必须是数字 效果展示&#xff1a; 代码展示&#xff1a; Teache…

lombok-macros

GITHUB 地址 LTPP-GIT 地址 官方文档 API 文档 一组提供 Lombok 类似功能的 Rust 宏。 安装 要使用此 crate&#xff0c;可以运行以下命令&#xff1a; cargo add lombok-macros用法 use lombok_macros::*;/// 定义一个结构体&#xff0c;使用 Lombok 宏派生所需的方法 #…

uniapp开发微信小程序实现获取“我的位置”

1. 创建GetLocation项目 使用HBuilder X创建一个项目GetLocation,使用Vue3。 2. 在腾讯地图开放平台中创建应用 要获取位置,在小程序中需要使用腾讯地图或是高德地图。下面以腾讯地图为例。 (1)打开腾讯地图开放平台官方网址:腾讯位置服务 - 立足生态,连接未来 (2)注册…

Docker基础知识 Docker命令、镜像、容器、数据卷、自定义镜像、使用Docker部署Java应用、部署前端代码、DockerCompose一键部署

目录 1.Docker 2.镜像和容器 2.1 定义 2.2 开机自动启动容器 3.docker命令 3.1 docker run 参数说明 3.2 常见命令 3.3 命令演示 3.4 命令别名 4.Docker命令详解 5.数据卷 5.1 定义 5.2 数据卷的相关命令 5.3 数据卷命令 5.4 挂载本地目录或文件 5.4.1 定义 5.4.2 mysql容器目录…

Linux | Ubuntu零基础安装学习cURL文件传输工具

目录 介绍 检查安装包 下载安装 手册 介绍 ‌cURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;首次发行于1997年‌‌12。cURL支持多种协议&#xff0c;包括FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3…

c# 2024/12/27 周五

6《详解类型、变量与对象》36 详解类型、变量与对象 _1_哔哩哔哩_bilibili

yarn list --pattern vuex-module-decorators

dgqdgqdeMac-mini spid-admin % yarn list --pattern vuex-module-decorators yarn list v1.22.22 └─ vuex-module-decorators0.16.1 ✨ Done in 0.24s.好的&#xff0c;这段代码是一个典型的 Vuex 模块定义&#xff0c;使用了 vuex-module-decorators 库。这个库为 Vuex 提…

uniapp 判断多选、选中取消选中的逻辑处理

一、效果展示 二、代码 1.父组件: :id=“this.id” : 给子组件传递参数【id】 @callParentMethod=“takeIndexFun” :给子组件传递方法,这样可以在子组件直接调用父组件的方法 <view @click="$refs.member.open()"

IDEA自己常用的几个快捷方式(自己的习惯)

TOC 背景 换工作了, 新的IDEA, 又要重新设置自己的快捷方式了. 灵感 1.这些个性话的配置应该是可以导出的. 然后在新的IDEA直接导入就行了, 感觉应该是有这个功能. 就是这个文件: <keymap version"1" name"Personal KeyMap" parent"$default…

学习AndroidPerfetto基础一

1.哔哩哔哩学习视频&#xff1a; Android Perfetto 基础和案例分享_哔哩哔哩_bilibili 2.Perfetto的简单介绍 Perfetto 是一个用于性能检测进而追踪分析的生产级开源工具 Perfetto提供上帝视角&#xff0c;背后需要整个Android系统的知识储备 Perfetto由Google开发&#x…

ffmpeg: stream_loop报错 Error while filtering: Operation not permitted

问题描述 执行ffmpeg命令的时候&#xff0c;报错&#xff1a;Error while filtering: Operation not permitted 我得命令如下 ffmpeg -framerate 25 -y -i /data/workerspace/mtk/work_home/mtk_202406111543-l9CSU91H1f1b3/tmp/%08d.png -stream_loop -1 -i /data/workerspa…

快速掌握Elasticsearch检索之二:滚动查询获取全量数据(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一&#xff1a;使用fromsize实现分页 1、滚动查询的使用场景 滚动查询区别于上一篇文章介绍的使用from、size分页检索&#xff0c;最大的特点是&#xff0c;它能够检索超过10000条外的…

StableAnimator模型的部署:复旦微软提出可实现高质量和高保真的ID一致性人类视频生成

文章目录 一、项目介绍二、项目部署模型的权重下载提取目标图像的关节点图像&#xff08;这个可以先不看先用官方提供的数据集进行生成&#xff09;提取人脸&#xff08;这个也可以先不看&#xff09;进行图片的生成 三、模型部署报错 一、项目介绍 由复旦、微软、虎牙、CMU的…