当前位置: 首页 > news >正文

C语言中的数据储存规则

写在开头

关于复习的相关内容其实从一开始就列出了大纲,但是迟迟没有开始复习,一方面是因为学校学业却是繁忙,另一方面还是内心对旧知识掌握不熟练需要再学一遍的畏惧和懒惰,但如今,复习必须开始了。今天我从C语言的最开始,数据存储开始讲起,慢慢回忆起尘封的往事---C语言。

C语言数据储存

数据类型的基本介绍

在C语言中,最基本的内置类型是必须要求掌握的。这也非常普遍的应用于我们的代码编写中。他们分别是

  • 属于整型:

    • char (unsigned char & signed char)

    • short (unsigned short & signed short)

    • int (unsigned int & signed int)

    • long (unsigned long & signed long)

    • long long

  • 属于浮点数

    • float

    • double

    • long double

  • 属于构造类型

    • 数组类型

    • 结构体类型 struct

    • 枚举类型 enum

    • 联合类型 union

  • 指针类型

  • 空类型 (void) 通常用在函数的返回类型,函数参数,指针类型等。

整型在内存中的存储

在语言的层面,创建一个变量是在内存中开辟出空间,而开辟多少空间的依据是变量本身的类型。比如int 类型的变量在被分配空间时,会被分配4个字节,也就是32bit 位的空间。那么数据到底在所开辟出来的内存中是如何存储的呢?

原码、反码、补码

计算机中总共有三种对整数的二进制表示方法,分别是原码、反码、补码。

三种表示方法中,都有符号位和数值位两部分组成。符号位0为正,1为负。而数值位略微复杂,需要分为正数和负数两种情况,正数的原反补都相同,负数的三种表示方法均不同。下面介绍一下原码、反码和补码:

原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。

反码:原码的符号位不变,其他位依次按位取反得到反码。

补码:反码+1得到补码。

对于整型数据,内存中存放的是补码。

因为:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理 (在CPU中只有加法器,利用补码可以做到加减统一处理);此外,补码和原码的相互转化,运算过程相同,不需要额外的硬件电路。

那我们可以尝试着算一下20 和 -10 在内存中的存储。

​​​​​​​ 

但是如果我们在VScode中输入

 int main(){int a = 20;int b = -10;return 0;}

并且监视内存,可以发现a、b变量在内存中的显示分别为

 a : 0x14 00 00 00b : 0xf6 ff ff ff

它们在内存中显示的是0x前缀,代表是16进制,但是却与我们转化的恰好相反,这是因为大小端存储模式。

大小端模式

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

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

记忆方法:小->低->低,剩下相反。

为什么存在大小端模式之分:计算机系统以字节作为内存的单位,每个地址对应一个字节。对于位数大于8位 (bit) 的处理器,由于寄存器的宽度大于1字节,那么必然存在着多字节间排列的问题,因此导致了大端存储和小端存储。

常用机器一般采取小端模式。

 //判断当前机器字节序列int check_sys(){int i = 1;return (*(char*)&i);}int main(){int ret = cheack_sys();if(ret == 1){printf("小端");}else{printf("大端");}return 0;}

浮点数的存储

浮点数的表示范围在 float.h 中定义。

根据国际标准IEEE754,任何一个二进制浮点数V可以表示成下面的形式:

 (-1)^S * M * 2^E// (-1)^S 表示符号位。当S=0,V为正数;S=1,V为负数// M代表有效数字,大于等于1,小于2。//所以M只可能写成1.xxxxxxx的形式,计算机会默认略去小数点前面的1,只会保存小数位,这样可以节省1为有效数字。// 2^E 表示指数位。E位一个无符号整数。但是科学计数法中指数位是可以出现负值的。所以IEEE754规定,存入内存时E的真实值必须加上中间数,32位浮点数,中间数位127,64位浮点数,中间数为1023.// 比如E = 10,保存成32位浮点数时,保存为10+127 = 137// 就是带符号位的二进制的科学计数法

IEEE 754规定:

32位的浮点数,最高位的1位是符号位S,紧接着的8位是指数E,剩下的23位为有效数字M。

64位的浮点数,最高位的1位是符号位S,紧接着11位是指数E,剩下的52位为有效数字M。

指数E可以细分为三种情况。

  1. 二进制E不全为0或者不全为1

    浮点数采用下面规则表示,E的计算值减去中间数(127 或者 1023),得到真实值。M加上第一位的1,得到真实的有效数字。

    举例:

  2. 二进制E全为0 (极限接近0的小数)

    浮点数的指数位E就等于 1 - 中间值,即为真实值。

    M不再加上1,而是还原为0.xxxxxx的小数,用于表示极限接近于0的很小的数字。

  3. 二进制E全为1 (正负∞)

    正负取决于符号位

数据存储小节完。

相关文章:

C语言中的数据储存规则

写在开头 关于复习的相关内容其实从一开始就列出了大纲,但是迟迟没有开始复习,一方面是因为学校学业却是繁忙,另一方面还是内心对旧知识掌握不熟练需要再学一遍的畏惧和懒惰,但如今,复习必须开始了。今天我从C语言的最…...

Android kotlin实战之协程suspend详解与使用

前言 Kotlin 是一门仅在标准库中提供最基本底层 API 以便各种其他库能够利用协程的语言。与许多其他具有类似功能的语言不同,async 与 await 在 Kotlin 中并不是关键字,甚至都不是标准库的一部分。此外,Kotlin 的 挂起函数 概念为异步操作提供…...

Pycharm中的Virtualenv Environment、Conda Environment

版本一 Conda Environment该不该选? 先说结论,该选,而且还是正解。前提是你打算"用Anaconda来管理各种Python环境,同时管理Python下面的各种包"。 选了Conda Environment意味着什么? 意味着你以后如果要装新的包的话&#xf…...

C++容器介绍:vector

目录vector简介使用方法1.头文件2.vector声明及初始化3.vector基本操作(1). 容量(2). 修改(3)迭代器(4)元素的访问(5)算法vector 简介 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vecto…...

抗锯齿和走样(笔记)

Artifacts(瑕疵): 比如人眼采样频率跟不上陀螺的旋转速度,这时就有可能看到陀螺在反方向旋转怎么做抗锯齿(滤波): 在采样之前先进行一个模糊操作,可以降低锯齿的明显程度 通过傅里叶…...

线程池的使用——线程池的创建方式

线程池的使用——创建线程线程池的创建线程池的创建方式Executors.newFixedThreadPool:Executors.newCachedThreadPool:Executors.newSingleThreadExecutor:Executors.newScheduledThreadPool:Executors.newSingleThreadScheduled…...

代码随想录算法训练营day47 |动态规划 198打家劫舍 213打家劫舍II 337打家劫舍III

day47198.打家劫舍1.确定dp数组(dp table)以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组213.打家劫舍II情况一:考虑不包含首尾元素情况二:考虑包含首元素,不包含尾元素情况三&#x…...

项目设计模式和规范

1、责任链模式 自己的理解:避免发生方与接收方解耦 优点:①降低发送方与接收方的耦合 ②简化他们对象 ③方便扩展新增 处理者 缺点:①不方便排错 ②性能问题,且使用不当容易搞出死循环 应用场景:拦截器 Interceptor和过滤器 filter:符合模式的进行拦截或者过滤到,然…...

无线WiFi安全渗透与攻防(一)之无线安全环境搭建

无线安全环境搭建 1.802.11标准 (1).概念 802.11标准是1997年IEEE最初制定的一个WLAN标准,工作在2.4GHz开放频段,支持1Mbit/s和2Mbit/s的数据传输速率,定义了物理层和MAC层规范,允许无线局域网及无线设备…...

【matplotlib】可视化解决方案——如何解决matplotlib中文乱码问题

问题概述 Matplotlib 默认不支持中文字体,这是因为 matplotlib 只支持 ASCII 字符,但是国人使用 matplotlib 肯定需要中文标注。如下图所示,当不对 Matplotlib 进行设置,而直接使用中文时,绘制的图像会出现中文乱码。…...

JAVA开发中GC日志打印简单通用的配置详解

如何配置一个完美的JVM日志打印信息 打印内容 打印基本的GC信息 打印对象分布情况 GC后打印堆数据 打印STW时间 打印safepoint信息 打印Reference处理信息 综上所述,最终的参数如下: 还有哪些问题呢?是不是有文件输出更好? 打印日…...

十进制的小数如何转二进制?二进制表示的小数如何转十进制?

😄 基础不牢,地动山摇~ 补补基础~ 文章目录 1、十进制的小数转二进制?2、二进制表示的小数转十进制?3、做道coding题巩固下:1、十进制的小数转二进制? 整数部分: 用普通的二进制表示即可。小数部分: 首先,将小数部分乘以2,取出整数部分作为二进制表示的第1位;然后…...

klipper使用webcam设置多个摄像头方式

一、前言 使用klipper设置多个摄像头,折腾了好些天,网上资料很少,这里写一个帖子记录一下 二、环境 参考链接:https://www.cnblogs.com/sjqlwy/p/klipper_webcam.html 我的klipper安装在香橙派上面,系统是debian&a…...

风力发电机组浪涌保护器安全防护方案

风机的庞大与危险高空作业注定了其在基建和维护中不易操作,风机设备的主电源、过程控制、网络与通讯、现场设备需要高等级的防雷浪涌保护器冲击保护,提高系统及设备的可靠性和可用性。风电场的主要发电设备风力发电机组“大风车”是风电场的主要发电设备…...

【剑指offer】JZ7 重建二叉树、JZ9 用两个栈实现队列

\描述: 给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。 思路: 题上给了我们前序遍历(根 …...

ElasticSearch - SpringBoot整合ES之查询所有 match_all

文章目录1. 数据准备2. 全量查询 match_all3. 使用 boost 参数更改 _score官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search…...

详谈IIC

前言 在嵌入式底层系统中,常见的通讯方式,串口,IIC,SPI,IIS等,一般IIC,SPI,IIS更多的采取IO模拟,其余CAN,UART均是硬件设计直接支持,而IIC主要用于多数传感器数据的读写&#xff0c…...

【Autoware】采集实验数据bag包并仿真运行

文章目录1. 官方demo包2. 控制底层地图采集3. 感知定位4. 规划控制5. 仿真或实车运行1. 官方demo包 wget http://db3.ertl.jp/autoware/sample_data/sample_moriyama_data.tar.gz wget http://db3.ertl.jp/autoware/sample_data/sample_moriyama_150324.tar.gz官方示例包的网上…...

名创优品怎么把创意做成生意?

最近,“主”无处不在,从让“依托答辩”梗火出圈的动画《三体》,到备受好评的电视剧《三体》,再到仍在刷新高票房成绩的《流浪地球2》。作为近些年来中国为数不多的爆款IP制造者,刘慈欣在《三体》中提出了一个著名的理论…...

springboot原项目配置文件迁移至nacos

目录一、配置文件迁移nacos1.安装nacos2.添加依赖3.改造service-product3.改造server-gateway一、配置文件迁移nacos 1.安装nacos 1,如果之前安装过nacos,nacos数据保存至mysql,先删除已安装的nacos,再安装 docker stop nacos …...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...