当前位置: 首页 > 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 …...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

AspectJ 在 Android 中的完整使用指南

一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...