C语言:数据的存储

news2025/8/17 6:17:32

数据的存储首先就要说到数据的类型,类型决定了看待内存空间的视角。C语言的数据类型分为内置类型和外置类型。

1.内置类型

(1)整型数组
char(字符型)、short(短整型)、int(整型)、long(长整型)(signed 或者 unsigned)

(2)浮点型
float(单精度浮点型)、double(双精度浮点型)

2.自定义类型
(1)数组类型
此处需要注意的是,去掉数组名就是数组的类型
比如int arr[10],去掉数组名arr,int [10]就是数组数据类型
(2)结构体类型(struct)
(3)枚举类型(enum)
(4)联合类型(union)

3.指针类型

4.空类型(void)
数据的存储形式就是以计算机的原码反码补码进行存储的

浮点型:不以原反补的形式进行存储

其他的数字又分为有符号数和无符号数

无符号数:无符号数的原反补三种码是一致的,存储的时候没有区别

有符号数:正数的原反补码是相同的,但是负数的原反补码需要经过运算转化(正数的最高位是0,负数的最高位是1)

原码:将二进制按照正负数形式翻译为二进制数字

反码:将原码的每一位取反

补码:反码+1

存储的时候一般存储数字的二进制序列补码

同时数据的存储存在大小端

内存空间具有编号,编号小的为低地址,编号大的为高地址

大端字节序也称:大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中

大端字节序也称:小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中

百度2015年系统工程师笔试题:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序

int check_sys()
{
    int a=1;
    return *(char*)&a;
}

int ret=check_sys();
if(ret==1)
    printf("小端\n");
else
    printf("大端\n");

字符型
char/signed char 所对应的存储区间为-128~ 127,同时规定10000000为-128。unsigned char所对应的存储区间为0~255.

在这里插入图片描述

signed与unsigned的区别就在于能否表示正负数

在数据的存储时,是否存在符号位

signed char与char类型的存储也可以用一个图来说明
在这里插入图片描述
下面举个栗子:

char a=-1;
//10000000 00000000 00000000 00000001
//11111111 11111111 11111111 11111110
//11111111 11111111 11111111 11111111
//char类型只有一个字节,所以存储的是11111111
//char要存储整型,发生整型提升:
//因为是是负数,有符号位,所以前面补1,又补成:
//11111111 11111111 11111111 11111111
//此时是补码,再减1取反,得到原码:
//10000000 00000000 00000000 00000001
//所以得到的a是负1
signed char b=-1;
//signed char有符号位跟char相同,打印的是-1
unsigned char c=-1;
//无符号位,在11111111前面补0,得到:
//00000000 00000000 00000000 11111111
//所以打印的是255
printf("a=%d b=%d c=%d\n",a,b,c);//-1 -1 255

再来个栗子:

char d=-128;
//10000000 00000000 00000000 10000000
//char d得到的是10000000
//整型提升得到
//11111111 11111111 11111111 10000000
//因为打印的是无符号十进制位,所以原反补码相同
//所以直接就打印出来:
//11111111 11111111 11111111 10000000
//=4294967168
printf("%u\n",d);
//其实如果char d=128,打印的也还是4294967168
//因为存储的补码还是10000000
//&d有符号十进制位
//&u无符号十进制位

char在内存中补码
00000000 -> 1
00000001 -> 2
00000010 -> 3

01111111 -> 127
10000000 -> -128
10000001 -> -127

11111101 -> -3
11111110 -> -2
11111111 -> -1

由此可见,有符号位的char类型的取值范围是-128~127
其中10000000直接规定成-128
假设我们有9个比特位
补码: 110000000
减1得到:101111111
原码: 110000000
所以,这样看也是-128
无符号位char类型取值就是0~255了

浮点型
浮点型并不依靠数据的原反补码进行存储
浮点型有其特殊的规定

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^ SM2 ^E
(-1)^s表示符号位,当s=0,V为正数,当s=1,V为负数
M表示有效数字,大于等于1,小于2
2^E表示指数位。

举例来说:
十进制的5.0,写成二进制是101.0,相当于1.01x2^2。那么按照上面V的格式,可以得出S=0,M=1.01,E=2

十进制的-5.0,写成二进制是-101.0,相当于-1.01x2^2。那么,S=1,M=1.01,E=2

IEEE754规定:对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M
在这里插入图片描述

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M.
在这里插入图片描述

IEEE754对有效数字M和指数E,还有一些特别规定。前面说过,1<=M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分

IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字

至于指数E,情况就比较复杂。

首先,E为一个无符号整数(unsignedint)这意味着,如果E为8位,它的取值范围为0-255;如果E为11位,它的取值范围为0-2047。但是我们知道,科学计数法中的E是可以出现负数的,所以EEE754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127:对于11位的E,这个中间数是1023。比如2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001

然后,指数E从内存中取出还可以再分成三种情况:

E不全为0或不全为1
这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023)得到真实值,再将有效数字M前加上第一位的1。比如:0.5(1/2)的二进制形式为0.1。由于规定正数部分必须为1,即将小数点右移1位则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:
0 01111110 00000000000000000000000

E全为0:
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原力0.xxxxxx的小数。这样做是为了表示±0以及接近于0的很小的数字

E全为1:
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)

好了,关于浮点数的表示规则,就说到这里

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络原理】应用层协议概述

1. HTTP协议 Hyper Text Transfer Protocpl&#xff08;超文本传输协议&#xff09;。允许将超文本语言&#xff08;HTML&#xff09;从web服务器传送到客户端的浏览器上。HTTP的端口号是80&#xff0c;HTTPS的端口号是443。 HTTP0.9和1.0使用的是非持续链接&#xff0c;每次…

nginx(六十五)proxy模块(六)处理上游的响应头部

一 处理上游的响应头部 重点&#xff1a; 生成了响应内容准备向客户端发送的时候,响应内容必须经过过滤模块的处理补充&#xff1a; 要关注默认行为 &#xff08;1&#xff09;禁用上游响应头对nginx的影响 ① proxy_ignore_headers 应用层如何控制nginx 背景&#xff1…

【电力系统】CJAYA算法优化光伏模型SDM参数附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Spring源码深度解析:九、bean的获取② - createBeanInstance

createBeanInstance()的流程图如下,让我们根据流程图一步一步的学习一下spring是如何创建bean的吧 一、前言 文章目录&#xff1a;Spring源码分析&#xff1a;文章目录 这篇文章应该是接着 Spring源码深度解析&#xff1a;八、bean的获取② - getSingleton 的继续分析过程。…

Eolink自动全代码注释自动上传API

目录 一、自动全代码注释 测试环境 Eolink Apikit安装 1、自建bootstrap项目用作测试 2、点击【File】->【Settings...】 3、搜索并安装【Eollink ApiKit】 4、添加eo注释 5、注释效果 二、一键上传API 1、配置服务信息 2、Server获取 3、SpaceKey获取 4、Proj…

C++回溯法leetcode练习集

文章目录什么是回溯法回溯法的模板组合组合总和|||洛谷刷题-八皇后问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示解析&#xff1a;电话号码的字母组合组合总和组合总和II分割回文串复原IP地址小结子集子集||递增子序列全排列全排列||842排列数字皇后问题什么…

BGP进阶:BGP 综合实验一

BGP路由优选规则 BGP是一个应用非常广泛的边界网关路由协议&#xff0c;被部署于大型的网络环境中。它能够支持大规模的网络&#xff0c;能够运载IP骨干网络中大批量的路由前缀并且在AS之间灵活的传递。BGP拥有丰富的路径属性&#xff0c;以及路由策略部署工具&#xff0c;正是…

win10家庭版安装Docker

首先查看你的电脑里面是否是win10且没有Hyper-V&#xff0c;是的话&#xff0c;那这个教程就是给你的啦~ 1、安装Hyper-v 首先将下面的内容复制到新建的txt中&#xff0c;将txt更名为Hyper-V.cmd,右键管理员运行这个文件 pushd "%~dp0"dir /b %SystemRoot%\servici…

为了提前预测比赛结果,于是我用Python获取比赛球员数据进行分析,结果...

为了提前预测比赛结果&#xff0c;于是我用Python获取比赛球员数据进行分析&#xff0c;结果...前因后果准备工作实现步骤代码展示部分效果展示最后前因后果 最近不是世界杯嘛&#xff0c;但是太忙了实在没时间看&#xff0c;于是为了凑热闹&#xff0c;用Python把本次球员信息…

AQS源码解析 5.Condition条件队列 await() signal() 核心方法

AQS源码解析—Condition条件队列 await() & signal() 核心方法 简介 在 Condition 条件队列中使用的也是 AQS 中的 Node 结构&#xff0c;它并没有使用 prev 和 next 属性&#xff0c;而使用的是 nextWaiter 去实现了一个单向链表的结构&#xff1a; Node nextWaiter;流…

MySQL索引和事务

目录 1.索引 1.1 索引的作用 1.2 查看索引 1.3 创建索引 1.4 删除索引 1.5 索引背后的数据结构(重点、面试题) 2.事务 2.1 什么是事务? 2.2 事务的使用 2.2.1 回滚 2.2.2 执行 2.3 事务的原子性(事务的初心) 2.4 事务的一致性 2.5 事务的持久性 2.6 事务的隔离性…

STM32之蜂鸣器实验

本章知识点 STM32GPIO的应用 蜂鸣器的原理&#xff08;最好网上看看&#xff09; 蜂鸣器概述 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作…

CFD基本概念

1、流动控制方程 2、流体力学中的流动模型及流场解 N-S方程→&#xff08;忽略粘性与热扩散&#xff09;→Euler方程→&#xff08;无旋&#xff09;→全速位方程→&#xff08;小扰动&#xff09;→小扰动方程→&#xff08;不可压&#xff09;→labplace方程&#xff1b; 数…

【机器学习】python实现随机森林

目录 一、模型介绍 1. 集成学习 2. bagging 3. 随机森林算法 二、随机森林算法优缺点 三、代码实现 四、疑问 五、总结 本文使用mnist数据集&#xff0c;进行随机森林算法。 一、模型介绍 1. 集成学习 集成学习通过训练学习出多个估计器&#xff0c;当需要预测时通过…

[附源码]SSM计算机毕业设计流浪动物救助网站JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【百度AI_人脸识别】图片对比相似度、人脸对比登录(调摄像头)

人脸对比 此文档功能&#xff1a; 两张人脸图片相似度对比&#xff1a;比对两张图片中人脸的相似度&#xff0c;并返回相似度分值。存档一张图片与调用的摄像中的人脸进行对比。项目、资源下载&#xff1a;https://download.csdn.net/download/m0_70083523/87150842?spm1001.2…

编译原理—语法制导翻译、S属性、L属性、自上而下、自下而上计算

编译原理—语法制导翻译、S属性、L属性、自上而下、自下而上计算1.语法制导翻译1.1属性文法1.2算术表达式的计数器1.3属性的分类1.4属性依赖图继承属性的计算1.5语义规则的计算方法1.6属性计算次序2. S属性定义2.1 语法树与分析树2.2 语法树与DAG2.2.1构造表达式的语法树(DAG)2…

Android中常见的那些内存泄漏——【问题分析+方案】

1.静态Activity(Activity上下文Context)和View 静态变量Activity和View会导致内存泄漏&#xff0c;在下面代码中对Activity的Context和TextView设置为静态对象&#xff0c;从而产生内存泄漏&#xff1b; public class MemoryTestActivity extends AppCompatActivity {private…

[附源码]SSM计算机毕业设计健身健康规划系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

noexcept说明符/运算符

一、noexcept说明符 1、语法 &#xff08;1&#xff09;noexcept 与 noexcept(true) 相同 &#xff08;2&#xff09;noexcept&#xff08;表达式&#xff09; 如果 表达式 求值为 true&#xff0c;那么声明函数不会抛出任何异常。 &#xff08;3&#xff09;throw() //c1…