首页 > 编程知识 正文

c语言浮点数存储方式,浮点型数据类型存储空间大小C语言

时间:2023-05-05 19:57:05 阅读:235763 作者:4292

数据类型 整型浮点型(实型)写在最后的话
我们都知道C语言有很多数据类型,如char ,int ,double 等等,本篇博客我们来梳理分类一下这些数据类型,首先我们可以将数据类型分为两类,整型和浮点型(也就是实型)两大类,有些读者可能就会疑惑了,char不是字符类型吗?怎么没列出来呢,别着急先继续往下阅读,下面会给出解释。

整型

整型包含:
char — 大小为1个字节
[signed] char
unsigned char
short — 大小为2个字节
[signed] short [int]
unsigned short [int]
int — 大小为4个字节
[signed] int
unsigned int
long —比较特殊大小为4/8个字节具体大小和编译器有关
[signed] long
unsigned long [int]
long long — 大小为8个字节
[signed] long long
unsigned long long [int]

unsigned表示无符号数,最高位也表示数据,即所有比特位均为有效数据位。方括号内的内容可以省略不写,省略并无影响。
为什么把字符型放在这里呢,是因为C语言采取的是ASCII编码,而每一个字符都对应了一个ASCII码值,而每个ASCII码值都对应了一个整数值(下面贴出了ASCII码表,博主在百度随便找的),所以就导致字符型的存储形式和整型其实一致,举个例子a和97(a的ASCII码值为97),看下图,所以博主就将char(字符型)放到了整型之中,现在大家可以理解了吗?


那么整型数据的存储形式到底是什么样的呢?答案是以二进制的补码形式储存的,二进制想必大家都知道,那么补码又是什么呢?那么又为什么会出现补码这个概念呢?
计算机以补码形式存储数据,并规定正整数的原、反、补三者相同,而负整数原、反、补三者的关系是原码除符号位的所有位取反为反码,反码加1为补码。取反就是二进制中的0变1,1变0,简单的举个例子10和-10的二进制表示,以int为例:

00000000000000000000000000001010 — 原码(10)
00000000000000000000000000001010 — 反码
00000000000000000000000000001010 — 补码

10000000000000000000000000001010 — 原码(-10)
11111111111111111111111111110101 — 反码
11111111111111111111111111110110 — 补码

之所以出现补码这个概念,是因为采用补码可以将符号位和数值域统一处理; 同时,加法和减法也可以统一处理(CPU只有加法器),感兴趣的小伙伴可以自行百度了解。
在查看内存中数据的时候是以十六进制展示的,并且博主使用的编译器是vs2019属于小端字节序存储模式(简单理解为数据倒着存),所以实际在内存中看到10的应该是0a 00 00 00而不是直接翻译过来的00 00 00 0a,而-10应该为f6 ff ff ff

上图来自《C陷阱与缺陷》介绍了存储模式
说了这么多不上代码就是在说废话,现在我们上代码验证一下我们所说的



可以看到结果我们我们想的一样,所以说整型是以二进制补码形式进行存储的,其余形式小伙伴们可以自行测试一下,接下来我们聊聊浮点型。

浮点型(实型)

浮点型包括
float — 单精度 大小为4个字节
double — 双精度 大小为8个字节
long double — 长双精度浮点型 大小为8个字节

那么浮点型和整型的储存形式的区别是什么呢?浮点型中可没有反码补码的概念
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
V=(-1)^S * M * 2^E
(-1)^s表示符号,当s=0,V为正数;当s=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。



其中M放入内存时会隐去开头的整数1,只存入小数部分,因为M都是整数1开头,取出时加上开头的1即可,这样做既不会产生什么误会,还能增加一位精度,何乐而不为呢?
而其中的E为无符号整数,也就是说E只能为正数,但是实际应用中指数是存在要为负的情况,为了表示正负所以就出现了一个叫中间数的概念,存入E时需要先加上中间数,然后存入内存,IEEE 754规定双精度的中间数为1023,单精度的中间数为127,以float为例,举个例子:

E还有两种特殊的情况,当一个数的指数全为1或全为0时,其中全为1,那么E实际为128,2的128次方无疑是个非常大的数,又因为M是一个介于1 ~ 2之间的数,那么我们就可以简单的理解为这个数无穷大,全为0时,E的实际值应为-127,2的-127次方无疑是一个非常接近0的数字,所以这个数就可以直接把小数部分拿出来当作其本身的值不需要加上开头的1了,正负均取决于S,IEEE 754 也是这样规定的
上图是博主从C语言中文网截取下来的供读者参阅,原文链接附上戳我转到原文

写在最后的话

到此想必认真阅读思考的小伙伴们对整型和浮点型的存储已经有所了解了,这么多的数据类型也对应了很多格式控制符,每种格式符都对应了一种或多种的数据类型,如果不小心弄错了就会出现意料之外的运行结果,这个时候也没必要慌张,我们可以慢慢调试自己的代码,逐行寻找问题所在,好了本篇博客就到此结束了,希望能对小伙伴们有所帮助,由于本人水平有限,文章中难免有说错或表达不清楚的地方,欢迎小伙伴们在评论区留言提出,或私信本人指出,我们下篇博客见。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。