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

news/2024/4/26 14:10:54/文章来源:https://blog.csdn.net/phoenixFlyzzz/article/details/131285161

目录

一、大小端存储

二、整型提升和截断

三、数据的二进制存储

四、结构体内存对齐


一、大小端存储

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

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

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 00000000printbinary(i2, 32);// 11111111 11111111 11111111 11111111printbinary(i3, 32);// 00000000 00000000 00000000 00010001printbinary(i4, 32);// 11111111 11111111 11111111 11101111cout << endl;int tmp = 0;float* f1 = (float*)&tmp;*f1 = 0;printbinary(*(unsigned*)f1, 32);    // 00000000 00000000 00000000 00000000float* f2 = f1;*f2 = -1;printbinary(*(unsigned*)f2, 32);    // 10111111 10000000 00000000 00000000// 1 01111111 00000000000000000000000 , E = 01111111B - 127D = 0, (-1)1 * 1.0 * 20 = -1float* 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 = 17float* f4 = f1;*f4 = -17;printbinary(*(unsigned*)f4, 32);    // 11000001 10001000 00000000 00000000cout << endl;long long temp = 0;double* d1 = (double*)&temp;*d1 = 0;printbinary(*(unsigned long long*)d1, 64);  //00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000double* d2 = (double*)&temp;*d2 = -1;printbinary(*(unsigned long long*)d2, 64);  //10111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000double* d3 = (double*)&temp;*d3 = 17;printbinary(*(unsigned long long*)d3, 64);  //01000000 00110001 00000000 00000000 00000000 00000000 00000000 00000000double* d4 = (double*)&temp;*d4 = -17;printbinary(*(unsigned long long*)d4, 64);  //11000000 00110001 00000000 00000000 00000000 00000000 00000000 00000000return 0;
}

四、结构体内存对齐

  对齐规则

  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(对齐) + 4printf("%d\n", sizeof(S3)); // 41 = 1 + 20 + 20printf("%d\n", sizeof(S4)); // 48 = 1 + 20 + 20 + 3(对齐) + 4
}

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

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

相关文章

springboot动态加载json文件

resources下面的配置文件&#xff0c;application文件修改启动会实时加载新的内容 其他的文件属于静态文件&#xff0c;打包后会把文件打入jar里面&#xff0c;修改静态文件启动不会加载新的内容 Resource areacode nre FileSystemResource("config" File.separa…

threeJs着色器

一、着色器 着色器&#xff08;Shaders &#xff09;是一种使用GLSL(OpenGL Shading Language)编写并在GPU上运行的程序。它们被用于定位几何体的每个顶点&#xff0c;并为该几何体的每个可见像素着色。使用“像素Pixel”来描述其实并不准确&#xff0c;因为渲染的每个点不一定…

【工具使用】Gitee

怎么创建Gitee仓库 1. 进入Gitee官网 https://gitee.com/ 2. 没有账号先注册 https://gitee.com/signup?redirect_to_url%2F 3.创建仓库 参考操作页面 你的电脑上要安装git 4. 电脑安装Git 1. 进入git官网&#xff08;官网下载方法-需要魔法工具&#xff09; https://…

Java集合Collection接口中的方法的使用

add、clear、addAll、isEmpty、size() Testpublic void test1(){Collection coll new ArrayList();//add(Object e):将元素e添加到集合coll中coll.add("AA");coll.add("BB");coll.add(123);//自动装箱coll.add(new Date());//size():获取添加的元素的个数…

p7付费课程笔记:jvm基础知识、字节码、类加载器

编程语言 演化&#xff1a; 机器语言->编程语言->高级语言&#xff08;java&#xff0c;c,Go,Rust等&#xff09; 面向过程–面向对象-面向函数 java是一种面向对象、静态类型、编译执行&#xff0c;有VM&#xff08;虚拟机&#xff09;/GC和运行时、跨平台的高级语言…

【Leetcode60天带刷】day17二叉树——110.平衡二叉树 , 257. 二叉树的所有路径 ,404.左叶子之和

题目&#xff1a; 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20…

数据库系统概述——第四章 数据库安全性(知识点复习+练习题)

&#x1f31f;博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f99a;专栏&am…

测量设备频宽范围选择要素—系统响应速度

系统响应速度是输入信号经过电压/电流驱动系统输出响应的幅值升到终值过程的斜率&#xff0c;而上升时间是系统响应速度的一种度量&#xff0c;上升时间越短&#xff0c;响应速度越快。 由一阶系统响应定义中&#xff0c;稳定的一阶系统上升时间 定义是响应从终值10%上升到终值…

手把手教你使用抖音DOU+创作个性化视频!

抖音DOU是抖音推出的一项全新功能&#xff0c;旨在为用户提供更加个性化、丰富多彩的内容创作和交流体验。DOU提供了一系列强大的创作工具&#xff0c;包括音频剪辑、特效滤镜、场景转换、字幕编辑等&#xff0c;让用户可以轻松地将自己的创意通过视频分享到抖音平台上来。下面…

selenium 要点击的元素被其他元素遮挡 or 无法找到非可视范围内的元素

selenium 无法找到非可视范围内的元素 org.openqa.selenium.StaleElementReferenceException: The element reference of is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed se…

MySQL优化--索引创建原则,索引什么时候会失效

目录 索引创建原则 面试回答 索引什么时候会失效 面试回答 索引创建原则 1). 针对于数据量较大&#xff0c;且查询比较频繁的表建立索引。 2). 针对于常作为查询条件&#xff08;where&#xff09;、排序&#xff08;order by&#xff09;、分组&#xff08;group by&…

Codesys高速计数应用(ST功能块)

Codesys如何创建FB请参看下面文章链接: CODESYS增量式PID功能块(ST完整源代码)_RXXW_Dor的博客-CSDN博客增量式PID的详细算法公式和博途源代码,请参看下面的文章链接:博途1200/1500PLC增量式PID算法(详细SCL代码)_博图scl语言pid增量编码器_RXXW_Dor的博客-CSDN博客。http…

进阶面向对象

面向对象的意义在于 将日常生活中习惯的思维方式引入程序设计中 将需求中的概念直观的映射到解决方案中 以模块为中心构建可复用的软件系统 提高软件产品的可维护性和可拓展性 类和对象是面向对象中的两个基本概念 类&#xff1a;指的是一类事务&#xff0c;是一个抽象的概…

Unity核心1——图片导入与图片设置

一、图片导入概述 ​ Unity 支持的图片格式有很多 BMP&#xff1a;是 Windows 操作系统的标准图像文件格式&#xff0c;特点是几乎不进行压缩&#xff0c;占磁盘空间大 TIF&#xff1a;基本不损失图片信息的图片格式&#xff0c;缺点是体积大 JPG&#xff1a;一般指 JPEG 格…

maven测试依赖的排除

1、概念 当 A 依赖 B&#xff0c;B 依赖 C 而且 C 可以传递到 A 的时候&#xff0c;A 不想要 C&#xff0c;需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。 所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 …

青少年和成人错误监测神经源的多模态研究

导读 儿童和成人对目标导向行为的监控能力不同&#xff0c;这可以通过几种任务和技术来测量。此外&#xff0c;最近的研究表明&#xff0c;错误监测的个体差异在调节焦虑情绪的倾向方面具有重要作用&#xff0c;而且这种调节作用会随着年龄的增长而变化。本研究使用多模态方法…

【深度学习】4-3 误差反向传播法 - Affine/Softmax层的实现

Affine层 神经网络的正向传播中进行的矩阵的乘积运算(也就是Y np.dot(X, W) B)在几何学领域被称为“仿射变换”。因此&#xff0c;这里将进行仿射变换的处理实现为“Affine层”。 几何中&#xff0c;仿射变换包括一次线性变换和一次平移&#xff0c;分别对应神经网络的加权…

2023 最新版navicat 下载与安装 步骤及演示 (图示版)

2023 最新版navicat 下载与安装 步骤演示 -图示版 1. 下载Navicat2 .安装navicat 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请…

解读Linux常用命令使用方法

文章目录 1.前言1.1 定义1.2 特点 2.常用命令介绍2.1 ls2.2 pwd2.3 cd2.4 touch2.5 cat2.6 mkdir2.7 rm2.8 cp2.9 mv2.10 man&#xff08;联机手册&#xff09;2.11 vim2.12 grep2.13 ps2.14 netstat 1.前言 1.1 定义 Linux是一套免费使用和自由传播的类Unix操作系统&#xf…

C语言(14) 谈谈嵌入式 C 语言踩内存问题!

1 概述 C 语言内存问题&#xff0c;难在于定位&#xff0c;定位到了就好解决了。 这篇笔记我们来聊聊踩内存。踩内存&#xff0c;通过字面理解即可。本来是操作这一块内存&#xff0c;因为设计失误操作到了相邻内存&#xff0c;篡改了相邻内存的数据。 踩内存&#xff0c;轻则…