【C/C++数据结构与算法】C语言数据存储

这篇具有很好参考价值的文章主要介绍了【C/C++数据结构与算法】C语言数据存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、大小端存储

二、整型提升和截断

三、数据的二进制存储

四、结构体内存对齐


一、大小端存储

  • 大端存储:数据的低位字节存储在高地址
  • 小端存储:数据的低位字节存储在低地址

不同编译器有不同的存储方式

int a = 10;
char* p = (char*)&a;
printf("%x\n", *p);        // a  --->  0000000a
// 0000 0000 0000 0000 0000 0000 0000 1010    
// 0    0    0    0    0    0    0    a        16进制数据:0x0000000a
// a在VS2019中的存储:0a 00 00 00 低地址 --> 高地址
// 整型在内存中以补码存储

二、整型提升和截断

  提升:短字节数据类型 ---> 长字节数据类型

  截断:长字节数据类型 ---> 短字节数据类型

char ch = -10;
unsigned char c = -10;
// 10000000000000000000000000001010    -10原码
// 11111111111111111111111111110101    -10反码
// 11111111111111111111111111110110    -10补码
// char类型的截断:11110110
// 整型提升:
// 11111111111111111111111111110110 ch补码  char是有符号类型数据,根据符号位数据补0或1
// 00000000000000000000000011110110 c 补码  c 是无符号类型数据,前面直接补0
printf("%d\n", ch);    // 将整型提升后的ch补码转换为原码输出为:-10
printf("%u\n", ch);    // 将整型提升后的ch补码直接转为10进制数据输出: 4,294,967,286
printf("%d\n", c);     // 将整型提升后的c 补码转换为原码输出为: 246
printf("%u\n", c);     // 将整型提升后的ch补码直接转为10进制数据输出: 246

三、数据的二进制存储

  正数:原码 = 反码 = 补码

  负数:符号位不变,原码剩余位取反得反码,再加一得补码,补码取反加一得原码

  浮点数:遵循IEEE754标准,二进制浮点数表示为(-1)^s * M * 2^E真

      S为数符,M为尾码,E为阶码,E = E真 + 127

      float 是单精度浮点数,数码 1 bit,尾码 23 bit,阶码 8 bit,共32位

      double是双精度浮点数,数码 1 bit,尾码 52 bit,阶码 11 bit,共64位

//打印int、float、double类型在内存的二进制编码
#include <iostream>
using namespace std;

int count = 0;

template<class t>
void printbinary(t e, int length) 
{
    if (length > 1) 
        printbinary(e >> 1, length - 1);
    putchar((e & 1) + '0');
    ::count++;
    if (::count % 8 == 0) 
        cout << ' ';
    if (::count % (sizeof(e) * 8) == 0) 
        cout << endl;
}

int main() 
{
    int i1 = 0, i2 = -1, i3 = 17, i4 = -17;
    printbinary(i1, 32);// 00000000 00000000 00000000 00000000
    printbinary(i2, 32);// 11111111 11111111 11111111 11111111
    printbinary(i3, 32);// 00000000 00000000 00000000 00010001
    printbinary(i4, 32);// 11111111 11111111 11111111 11101111
    cout << endl;

    int tmp = 0;
    float* f1 = (float*)&tmp;
    *f1 = 0;
    printbinary(*(unsigned*)f1, 32);    // 00000000 00000000 00000000 00000000

    float* f2 = f1;
    *f2 = -1;
    printbinary(*(unsigned*)f2, 32);    // 10111111 10000000 00000000 00000000
  // 1 01111111 00000000000000000000000 , E = 01111111B - 127D = 0, (-1)1 * 1.0 * 20 = -1
    float* f3 = f1;
    *f3 = 17;
    printbinary(*(unsigned*)f3, 32);//01000001 10001000 00000000 00000000
  // 0 10000011 00010000000000000000000 , E = 10000011B - 127D = 4, (-1)0 * 1.0001 * 24 = 10001B = 17
    float* f4 = f1;
    *f4 = -17;
    printbinary(*(unsigned*)f4, 32);    // 11000001 10001000 00000000 00000000
    cout << endl;

    long long temp = 0;
    double* d1 = (double*)&temp;
    *d1 = 0;
    printbinary(*(unsigned long long*)d1, 64);  //00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  
    double* d2 = (double*)&temp;
    *d2 = -1;
    printbinary(*(unsigned long long*)d2, 64);  //10111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

    double* d3 = (double*)&temp;
    *d3 = 17;
    printbinary(*(unsigned long long*)d3, 64);  //01000000 00110001 00000000 00000000 00000000 00000000 00000000 00000000

    double* d4 = (double*)&temp;
    *d4 = -17;
    printbinary(*(unsigned long long*)d4, 64);  //11000000 00110001 00000000 00000000 00000000 00000000 00000000 00000000

    return 0;
}

四、结构体内存对齐

  对齐规则文章来源地址https://www.toymoban.com/news/detail-492244.html

  1. 第一个成员在与结构体偏移量为0的地址处
  2. 其他成员要对齐到对齐数的整数倍的地址处
  3. 对齐数:编译器默认的某个数字与该成员大小的较小值(VS默认值是8)
  4. 结构体总大小为最大对齐数的(每个成员变量都有一个对齐数)整数倍
  5. 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是最大对齐数(含嵌套结构体对齐数)的整数倍
#include <stdio.h>

struct S1 
{
  char c1;
  int i;
  char c2;
};

struct S2 
{
  char c1;
  char c2;
  int i;
};

struct S3 
{
  char c1;
  char c2[20];
  char c3[20];
};

struct S4 
{
  char c1;
  char c2[20];
  char c3[20];
  int i;
};

int main() 
{
  printf("%d\n", sizeof(S1)); // 12 = 1 + 3(对齐) + 4 + 1 + 3(对齐)
  printf("%d\n", sizeof(S2)); // 8 = 1 + 1 + 2(对齐) + 4
  printf("%d\n", sizeof(S3)); // 41 = 1 + 20 + 20
  printf("%d\n", sizeof(S4)); // 48 = 1 + 20 + 20 + 3(对齐) + 4
}

到了这里,关于【C/C++数据结构与算法】C语言数据存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构 C语言 树形结构 简单目录管理系统

    在图书、操作系统文件夹、学生等管理系统中,目录管理是必要环节,如何高效搜寻与低复杂度存储是实现这一环节的关键性问题。本课程设计需完成一种基于多叉树结构简单目录管理系统,该系统能以交互式界面进行创建目录、删除目录、查找目录、修改目录、层次遍历目

    2024年02月07日
    浏览(45)
  • 【数据结构与算法分析】使用C语言实现队列的两种(带头结点与不带头结点)链式存储,并且给出一种循环队列的设计思想

      当我们编写程序时,经常需要处理各种数据结构。队列是一种常见的数据结构,它有着广泛的应用场景。队列的基本操作包括入队和出队,应用于模拟等待队列、消息队列、计算机缓存等场合。   在实际编程中,我们可以用不同的数据结构来实现队列。本文主要介绍了

    2024年02月08日
    浏览(102)
  • 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中。。。。。。 第一章高精度计算 1307【例1.3】高精度乘法 1308【例1.5】高精除 1309【例1.6】回文数(Noip1999) 1168大整数加法 1169大整数减法 1170计算2的N次方 1171大整数的因子 1172求10000以内n的阶乘 1173阶乘

    2024年02月16日
    浏览(46)
  • 【数据结构】线性表的顺序存储结构及实现——C语言版

    线性表的顺序存储结构称为 顺序表 ,其基本思想是 用一段地址连续的存储单元一次存储线性表的数据元素。 设顺序表的每个元素占用 c 个存储单元,则第 i 个元素的存储地址为: 所以, 只要确定了存储顺序表的起始地址(即基地址),计算任意一个元素的存储地址的时间

    2024年03月15日
    浏览(51)
  • 数据结构与算法——顺序表(顺序存储结构)及初始化详解

    顺序表 ,全名 顺序存储结构 ,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。 不仅如此,顺序表对数据的物理存储结构也有要求。 顺序表存储数据时,会提前申请一整块足够大小的物理

    2024年02月16日
    浏览(39)
  • 【数据结构】详谈队列的顺序存储及C语言实现

    大家好,很高兴又和大家见面啦!!! 在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。 队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算的定义

    2024年01月21日
    浏览(73)
  • 【C语言 数据结构】数组与对称矩阵的压缩存储

    提到数组,大家首先会想到的是:很多编程语言中都提供有数组这种数据类型,比如 C/C++、Java、Go、C# 等。但本节我要讲解的不是作为数据类型的数组,而是数据结构中提供的一种叫数组的存储结构。 和线性存储结构相比,数组最大的不同是:它存储的数据可以包含多种“一

    2024年02月04日
    浏览(46)
  • 【数据结构】稀疏矩阵的压缩存储(三元组表、十字链表)(C语言)

    稀疏矩阵 是指矩阵中大多数元素为零的矩阵。从直观上讲,当非零元素个数低于总元素的30%时,这样的矩阵为稀疏矩阵。 1.1 三元组表的存储结构 稀疏矩阵的三元组表表示法是指只存储非零元素,同时存储该非零元素在矩阵中所处的行号和列号的位置信息。 为方便处理,将

    2023年04月16日
    浏览(39)
  • 优化后端系统的计算和存储效率 - 高效算法与数据结构

    在构建后端系统时,高效的算法与数据结构是至关重要的。它们可以显著提升计算和存储效率,从而使系统更稳定、快速且可扩展。本文将介绍一些常见的高效算法和数据结构,以及它们在优化后端系统中的应用。 哈希表是一种常用的数据结构,它通过将键映射到一个固定大

    2024年02月11日
    浏览(49)
  • 【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算

       Qestion:   完成用十字链表存储的稀疏矩阵的加法运算。 获取两个稀疏矩阵总有多少个非零元素,记作 cnt 。 当 cnt 不为零时一直循环,每循环一次 i++ ,也就是行循环,每循环一次就转移至下一行。 先从第一行开始循环,使得两个工作指针 p 、 q 分别指向两个稀疏矩阵

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包