文章目录
-
- 一、数据类型详细介绍
- 1.c语言的基本内置类型
- c语言的类型:
- 2.类型的意义:
- 3.类型的基本分类
- 二、整型在内存中的存储
- 1. 数据在所开辟内存中是如何储存的呢?
- 2.为什么内存存放的是补码?
- 3. a,b在内存中如何存储
- 4.大小端介绍
- 5.大小端存在的原因
- 6.百度2015年系统工程师笔试题:
- 三、浮点型在内存中的存储
- 1.浮点数表示的形式
- 2.浮点型在内存中存放形式
- 本章完!!
一、数据类型详细介绍 1.c语言的基本内置类型 (c语言本身就具有的类型,我们可以直接拿来使用)
文章图片
c语言的类型: 1.内置类型
2. 自定义类型(构造类型)
文章图片
2.类型的意义: 1.使用这个类型开辟内存空间的大小(大小决定了使用范围)
??一个整形1,只占4个字节,为了节省内存空间,我们就用int类型来存储,而没必要用long long类型。
2.如何看待内存空间的视角
??float类型占4个字节,站在float类型角度去看内存空间,存储的只能是浮点数(小数)
??int同样是4个字节,但是在int的角度看内存空间,存储的是整型。这就是视角的问题。
代码说明:
int main()
{
int a = 10;
float b = 10.0;
return 0;
}
int和float都是4个字节,向变量a,b都放一个10;观察内存空间
???
&a
文章图片
?
&b
文章图片
??内存空间的存储明显不一样,在int中10以整形的方式放入内存,在float中10以浮点数的方式放入内存,这就验证了 看待不同类型的内存空间的视角也不相同。
??既然提到了类型,那么我们将类型分分类
3.类型的基本分类 (1)整形家族
文章图片
为什么char属于整形家族呢?
??首先char是字符类型的,不好归类,同时字符在内存中是以Ascll码值存储的,Ascll码值是整数,字符存储的时候也是以整数进行存储的,所以也属于整形家族
??unsigned signed 怎么描述有符号无符号呢?
以char类型举例:
signed(有符号)
文章图片
有符号的数字,最高位为符号位。(0—正 1----负)
unsigned(无符号)
文章图片
无符号的数字,没有符号位
11111111 对应的是255(2)浮点型家族
文章图片
(3)构造类型(自定义类型)
文章图片
(4)指针类型
文章图片
(5)空类型
文章图片
??常用于函数,void 用于不需要返回值的函数,用于返回类型的地方
??可用于函数的参数。
?接下来重点解释整型和浮点型在内存中的存储
二、整型在内存中的存储 ??一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型决定的。
1. 数据在所开辟内存中是如何储存的呢? 比如:
int a = 20;
int b = -10;
??我们都知道a分配4个字节,那么a如何储存呢?
??这里我们就需要了解以下概念:
文章图片
文章图片
?通过调试,我们得知了a,b在内存中存储的内容,那么a,b是如何转换成这样的数据呢?
文章图片
将a,b进行二进制转换,内存中存储的是补码,计算a,b的补码
文章图片
??好的,得到补码后,内存显示的是16进制的数字,我们将补码转换为16进制,
??用到二进制转换为十六进制的规则,每4个二进制位用一个16进制的数字表示
文章图片
文章图片
??所以我们得到一个结论:对于整形来说,数据存放内存中其实存放的是补码。
2.为什么内存存放的是补码?
文章图片
??这段话中的重点 :CPU只能进行加法运算
??我们用一个代码对 为什么内存存放补码 进行解释
int main()
{ int a = 1;
int b = -1;
int c = 1 - 1;
return 0;
}
请问在CPU只能进行加法运算的条件下,c如何计算得出结果
00000000 00000000 00000000 00000001 ----1的二进制原码
10000000 00000000 00000000 00000001 ---- -1的二进制原码如果按照原码直接相加
那么我们会得到-2的结果
请问1-1=-2吗?结果当然是错误的!!!
但是转换补码形式
01111111 11111111 11111111 11111111 —1的补码
11111111 11111111 11111111 11111111 — -1的补码相加的结果
10000000 0000000 0000000 0000000 (c的补码)整型只能存储32bit位,前面的1舍去
c是一个整型,只能存32个bit位,所以补码就为全0
c的结果为0;结果正确!!!
通过举这个1-1的反例 我们得知为什么内存中存储的是整形的二进制补码。
??重新回到前头
3. a,b在内存中如何存储
文章图片
??我们可以看到a,b分别存储的是补码,但是顺序不对劲,这又是为什么?
4.大小端介绍
文章图片
文章图片
文章图片
5.大小端存在的原因 ??为什么有大小端之分呢?
文章图片
??了解了大小端的概念,那我们应该就知道我们的机器使用的是小端字节序存储方式,所以才会出现倒着存的现象。
??借着这个机会,了解一下大小端的知识
6.百度2015年系统工程师笔试题: ??请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序
#include
int check_sys()
{
int i = 1;
return (*(char *)&i);
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n";
)
}
return 0;
}
??由于篇幅有限,在下一次的博客中将会讲解大小端整型内存存放的练习题。博客入口:C语言进阶(二)— 整型存放练习
??好了,到此我们就知道了整型在内存中是如何存储的,那么浮点型的数据在内存中是如何存储的?
三、浮点型在内存中的存储
1.浮点数表示的形式
文章图片
举例来说:
?十进制的 5.0 ,写成二进制是 101.0,相当于 1.01 * 2 ^ 2 .按照上面v的表达形式,可以得出
? S=0;
? M=1.01;
? E=2;
2.浮点型在内存中存放形式
文章图片
文章图片
对于有效数字M存放在内存是还有以下具体规定:
前面说过 1.0 <= M < 2.0, M可以写成 1.xxxxx 的形式,其中 xxxx 是小数部分
文章图片
??以上面的 5. 0 为例,表示成 1.01 * 2 ^ 2,有效数字为 1.01 ,其中由于所有的有效数字整数部分都为1,所以为了节省有效数字,只将小数点后面的 01 放入内存中。
M的取出
??当然,把有效数字从内存中取出时,记得取出的是有效数字的小数位,还要自动在小数位前补1.
至于指数E,情况就更加复杂
E在内存中存放
文章图片
以8位的E举例子
以十进制的 0.5 举例子
0.5转换成二进制为 0.1
0.1
1.0 * 2 ^ (-1)
此时E为-1,为负数,但是E为一个无符号整数。
??所以我们将E存入内存时就需要借助一个中间数,对于 8 位的E,这个中间数是 127 ,所以实际在内存中存放的 E= -1 + 127 = 126.
E从内存中取出
文章图片
??E不全为 0 或不全为 1 ,为正常的情况,只需将 E - 127 ,即可得到真实的E。
??E全为 0 时,当真 E + 127 = 0 ,则真实的 E = - 127,一个数字的 - 127 次方约等于 0 ,所以我们得到的是一个无限接近于 0 的数字(几乎不存在),所以 IEE754 规定了, E = 1 - 127 或者 E = 1 - 1023 即为真实值,有效数字不加上第一位的1,直接以 +/- 0.xxxx * 2^(-126) 为结果。
??E全为1,结果为 +/- 1.xxxx * 2 ^ (128),一个表示正负无穷大的数字.
??整型和浮点型在内存中的存放就说到这里,希望大家能够多多练习,熟悉掌握这两种类型在内存中的存放规则。
谢谢欣赏!!!!
本章完!!
【c语言|C语言进阶(一)---数据的存储】C语言进阶(二)——整形存放练习已更新
推荐阅读
- C知识点的总结|【读取字符串长度的函数my_strlen】
- C语言基础|【C语言基础10——指针(1)】
- C语言基础|【C语言基础6——数组(2)三子棋】
- docker|如何部署一个Kubernetes集群
- c语言实现strcat函数
- C语言|C语言的内存操作函数
- C|结构体(初识)
- C|【C语言的灵魂】-指针(2)
- C|C语言的灵魂-指针(1)