首页 > 系统相关 >深度剖析数据在内存中的存储~

深度剖析数据在内存中的存储~

时间:2024-09-27 19:48:35浏览次数:9  
标签:存储 反码 字节 浮点数 补码 剖析 内存 原码

今天给小伙伴们分享的是数据在内存中存储的相关知识,全程干货满满哦~

一.基本类型的介绍

在C语言中,基本内置类型及其通常的内存大小如下。但请注意,实际的大小取决于编译器和正在运行程序的系统的架构(32位或64位)。

  1. 整数类型:

    • int: 通常为 4 字节,但有时在某些系统上可能是 2 字节。
    • char: 总是为 1 字节。
    • short: 至少为 2 字节,通常是 2 字节。
    • long: 至少为 4 字节,32位系统上通常是 4 字节,64位系统上可能是 8 字节。
    • long long: 至少为 8 字节。
  2. 浮点类型:

    • float: 通常是 4 字节(单精度)。
    • double: 通常是 8 字节(双精度)。
    • long double: 至少为 12 字节,但可能更大。
  3. 无符号类型:

    • unsigned int: 与 int 相同。
    • unsigned char: 与 char 相同。
    • unsigned short: 与 short 相同。
    • unsigned long: 与 long 相同。
    • unsigned long long: 与 long long 相同。
  4. 布尔类型 (C99 标准引入):

    • bool: 通常为 1 字节。
    • _Bool: 至少为 1 字节。
  5. _Complex 类型 (C99 标准引入):

    • complex: 由两个 float 类型的值组成,因此通常是 8 字节。
    • double _Complex: 由两个 double 类型的值组成,因此通常是 16 字节。
  6. void 类型:

    • void: 没有内存大小。
  7. 指针类型:

    • 指针的大小取决于系统的架构:
      • 在32位系统上,指针通常是 4 字节。
      • 在64位系统上,指针通常是 8 字节。
  8. 枚举类型 (enum):

    • enum: 大小取决于底层的表示类型,但至少与 int 相同。
  9. 结构体类型 (struct):

    • struct: 大小取决于其成员的排列和对齐。
  10. 联合类型 (union):

    • union: 大小等于其最大成员的大小。
  11. 数组类型:

    • 数组的大小是其元素大小乘以元素数量。

要确定特定系统上特定类型的确切大小,可以使用 sizeof 运算符。

二. 原码、反码、补码

一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型而决定的。 那么数据在所开辟内存中到底是如何存储的呢? 这里就得引出 原码 、反码和补码了, 整型的存储 与它们息息相关。

在计算机科学中,原码、反码和补码是用于表示有符号整数的不同二进制编码方式。这些编码方式在计算机系统中用于简化算术运算,尤其是在处理负数时。以下是每种编码方式的详细解释:

  1. 原码(True Form):

    • 原码是最直观的表示方法,其中最高位用作符号位(0表示正数,1表示负数),其余位表示数值的绝对值。
    • 例如,对于一个8位的整数,0010 0101(原码)表示正数3,而1010 0101(原码)表示负数3。
  2. 反码(One's Complement):

    • 反码用于表示负数的另一种形式。对于正数,其反码与原码相同;对于负数,反码是其原码除符号位外,其他各位取反(即0变1,1变0)。
    • 例如,0010 0101(反码)表示正数3,而1111 1010(反码)表示负数3。
  3. 补码(Two's Complement):

    • 补码是计算机中最常用的表示方法,用于简化二进制的加法和减法运算。对于正数,其补码与原码相同;对于负数,补码是其反码加1。
    • 补码的设计允许计算机使用相同的加法运算来处理加法和减法,因为负数的补码可以通过加1得到正数的补码。
    • 例如,0010 0101(补码)表示正数3,而1111 1011(补码)表示负数3。

特点和用途:

  • 原码:直观,但不利于计算机处理。
  • 反码:用于表示负数的一种方式,但不是计算机中常用的表示方法。
  • 补码:计算机中最常用的表示方法,因为它允许使用相同的硬件电路来处理加法和减法。

示例:

假设我们有一个8位的整数,数值为3和-3:

  • 原码:

    • 正数3:0010 0101
    • 负数3:1010 0101
  • 反码:

    • 正数3:0010 0101
    • 负数3:1111 1010
  • 补码:

    • 正数3:0010 0101
    • 负数3:1111 1011

在计算机系统中,通常使用补码来表示整数,因为它简化了算术运算的硬件实现。

三.大小端介绍

大小端(Endianness)是指计算机系统中字节(Byte)的排列顺序。在多字节数据(如整数、浮点数等)的存储中,不同的计算机系统可能会以不同的方式排列字节的顺序。主要有两种大小端模式:

  1. 大端(Big-Endian):

    • 在大端模式中,最重要的字节(最高有效字节,即MSB)存储在最低的内存地址处,其次是次高有效字节,以此类推,直到最低有效字节(LSB)存储在最高的内存地址处。
    • 例如,假设有一个16位的整数 0x1234,它在大端模式下的内存存储顺序为 0x12 0x34
  2. 小端(Little-Endian):

    • 在小端模式中,最低有效字节(LSB)存储在最低的内存地址处,然后是次低有效字节,以此类推,直到最高有效字节(MSB)存储在最高的内存地址处。
    • 同样以 0x1234 为例,它在小端模式下的内存存储顺序为 0x34 0x12

影响:

大小端模式的不同会影响数据在网络上的传输以及不同系统间的文件交换。例如,网络协议通常规定以大端模式传输数据,而许多现代的个人电脑和服务器则使用小端模式存储数据。

如何确定系统的类型:

在C语言中,可以通过编写一个简单的程序来确定系统是大端还是小端:

#include <stdio.h>

int main() {
    unsigned int x = 0x12345678;
    char *c = (char*) &x;
    if (*c == 0x78) {
        printf("Little-Endian\n");
    } else {
        printf("Big-Endian\n");
    }
    return 0;
}

这段代码通过检查一个整数的最低位字节的内容来确定系统的字节序。如果输出是 0x78,则系统是小端模式;如果输出是 0x12,则系统是大端模式。

总结

大小端模式是计算机系统设计中的一个基本属性,它影响着数据的存储和传输。了解和处理大小端问题是计算机编程中的一个重要方面。

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

浮点型的存储与整型的存储大大不同。在计算机系统中,浮点数的存储通常遵循特定的标准,以确保不同系统和平台之间浮点数的一致性和可移植性。最常用的标准是 IEEE 754 标准,它定义了浮点数的存储格式、精度和操作。

IEEE 754 标准

IEEE 754 标准有几种不同的格式,包括单精度(32位)、双精度(64位)和扩展精度(80位、128位等)。这里我们主要讨论最常用的单精度和双精度浮点数:

  1. 单精度浮点数(32位):

    • 符号位(1位):最高位是符号位,0 表示正数,1 表示负数。
    • 指数位(8位):表示数值的范围,使用偏移量(bias)表示,单精度中 bias = 127。
    • 尾数位(或小数位,23位):表示数值的精度,存储实际的数值部分。
  2. 双精度浮点数(64位):

    • 符号位(1位):同样,最高位是符号位。
    • 指数位(11位):双精度中的 bias = 1023。
    • 尾数位(或小数位,52位):存储实际的数值部分。

存储格式

以单精度为例,一个浮点数 A 在内存中的存储可以分为三个部分:

  1. 符号位:1位
  2. 指数:8位
  3. 尾数:23位

存储格式如下:

SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM
  • S 代表符号位
  • E 代表指数位
  • M 代表尾数位

计算方法

  1. 指数:存储的指数值需要减去偏移量(bias)来得到实际的指数值。
  2. 尾数:尾数部分通常在存储时会默认加上一个隐含的前导1(对于规格化数),即 1.MMMMMMMMM,其中 1 是隐含的。

示例

假设有一个单精度浮点数 A = 3.5,其二进制表示为 11.1(忽略小数点后的无限循环部分),则:

  1. 符号位 S 为 0(因为 A 是正数)。
  2. 指数部分 E 为 10000101,转换为十进制为 133,实际指数为 133 - 127 = 6
  3. 尾数部分 M 为 10000000000000000000000

因此,3.5 的 IEEE 754 表示为:

0 10000101 10000000000000000000000

注意

  • 特殊值如 NaN(非数)、Infinity(无穷大)和 0(零)有特殊的编码方式。
  • 浮点数的表示可能不是唯一的,因为存在规格化和非规格化数的不同表示。

了解浮点数的存储方式对于编写精确的数值计算程序非常重要,尤其是在处理浮点数精度和舍入误差时。

最后祝小伙伴们天天开心,早日成为技术大牛@

标签:存储,反码,字节,浮点数,补码,剖析,内存,原码
From: https://blog.csdn.net/Code_Allen/article/details/142592046

相关文章

  • C语言数据类型及存储
    C语言数据类型分类C语言数据类型分为内置类型和自定义类型内置类型内置类型是C语言自带的数据类型,整形,浮点型,字符型,指针,空类型等都属于内置类型,他们的意义比较单一,往往用来表示一个含义,比如整形,可以用来记录年龄,次数等数据,浮点类型可以用来存放身高,成绩等实数类型。void(空......
  • STL之vector篇(下)(手撕底层代码,从零实现vector的常用指令,深度剖析并优化其核心代码)
    文章目录1.基本结构与初始化1.1空构造函数的实现与测试1.2带大小和默认值的构造函数1.3使用迭代器范围初始化的构造函数(建议先看完后面的reserve和push_back)1.4拷贝构造函数1.5赋值操作符的实现(深拷贝)1.6析构函数1.7`begin`与`end`迭代器2.容量管理2.1`re......
  • oracle数据库内存分配方案
    查询当前参数设置SQL>showparametersgaSQL>showparameterpgaSQL>showparametermemory参数说明sga_target期望的sga大小sga_max_size最大sga大小pga_aggregate_target期望的pga大小pga_aggregate_limit最大pga大小设置原则sga_target不能大于sga_max_si......
  • PARTIV-Oracle数据库存储结构-内存架构
    14.内存架构14.1.Oracle是数据库内存结构简介当实例启动时,Oracle数据库会分配一个内存区域并启动后台进程。这个内存区域存储以下信息:程序代码每个已连接会话的信息,即使它当前未活跃程序执行期间需要的信息,例如,正在从中提取行的查询的当前状态锁数据等在进程间共享和通信......
  • GaussDB内存过载分析
    问题现象数据库进程内存占比较高长时间占比较高观察监控平台内存占用的变化曲线,无论当前数据库是否有业务在运行,数据库进程内存占总机器内存的比例长时间处于较高状态,且不下降。执行作业期间占比较高数据库进程在没有业务执行时,内存使用持续处于较低的状态,当有业务执行时,内......
  • Java中多态的内存
    一、内存分配区域Java内存主要分为栈区、堆区、方法区等区域。1.栈区:栈区是Java内存管理中的一个关键区域,它主要用于存储局部变量和方法的执行环境(也称为栈帧)。每个线程在JVM中都有一个私有的栈,用于存储该线程中方法调用的上下文信息。栈区内存主要存放的数据有:局部变量表、......
  • 【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
    文章目录从零实现C++Vector前言1.基本结构与初始化细分1.1空构造函数的实现与测试实现代码:测试用例:输出:1.2带大小和默认值的构造函数实现代码:测试用例:输出:1.3拷贝构造函数实现代码:测试用例:输出:1.4赋值操作符的实现实现代码:测试用例:输出:2.容量管理的实现与测......
  • 旋转不息的数据飞轮:从存储到洞见的演化之旅
    旋转不息的数据飞轮:从存储到洞见的演化之旅在这个数据驱动的时代,企业的存储方案选择和数据策略变得至关重要。从早期的数据仓库,到不久前引领潮流的数据中台,再到现在备受瞩目的数据飞轮,数据技术的进步不仅彻底改变了业务流程,更深入地影响了整个商业生态系统。数据仓库:坚实的底层框......
  • 服务器数据恢复—存储中raid硬盘故障导致映射到服务器上的卷挂载不上的数据恢复案例
    服务器存储数据恢复环境&故障:一台存储上有一组由16块FC硬盘组建了一组raid。存储前面板上的对应10号和13号硬盘的故障灯亮起,存储映射到redhatlinux操作系统服务器上的卷挂载不上,业务中断。服务器存储数据恢复过程:1、通过存储的管理后台查看当前存储状态,管理后台报告逻辑卷状态......
  • 在 ArkTS 中,如何有效地进行内存管理和避免内存泄漏?
    ArkTS是鸿蒙生态的应用开发语言,它在TypeScript的基础上进行了优化和定制,以适应鸿蒙系统的需求。以下是在ArkTS中进行有效的内存管理和避免内存泄漏:1.使用const和let合理声明变量:使用const声明那些不会重新赋值的变量,这有助于确保变量的不变性,并可能让编译器进行更......