- 数据类型的介绍
![](https://img-blog.csdnimg.cn/img_convert/c1440a0d14934613843316c11f1164ca.png)
以上是数据类型的常用分类,我们为什么要设置这么多不同的数据类型呢?
这就要展开讲讲数据类型的意义:
在编写程序的时候我们无时不刻都要创建变量,这些变量有着不同视角比如我要创建一个专门存放字符的变量或者我要创建一个存放数字的变量呢么他们就需要用不同的数据类型来开辟适合他们的空间。
比如我要创建一个字符型变量,而我们知道字符的ACIS码值最多只有255,呢我们就不需要用多余的字节去存放他,而int型的变量我们要存放的数字就需要更多的字节去存储。
所以,数据类型的意义就是我们看待这个变量的视角,和它所开辟得到空间大小。
1.1类型的基本分类:
整形类型
浮点型类型
构造类型
指针类型
空类型
整形类型
![](https://img-blog.csdnimg.cn/img_convert/11d3d3547f4e48cbb7bfc0e7ef86f3e4.png)
不要对signed char类型感到新奇,其实就是我们平时用的char只是将signed省略而已。
关于unsigned和sigened类型我就以char举例说明一下:
我们知道一个char类型的变量大小为1个字节就是8个比特位,而unsigned和sigened之间的区别就是一个比特位上的数字是否位符号位。unsigned没有符号位而signed有符号位所以unsinged char的值可以达到255,而char只有128。
浮点数类型
![](https://img-blog.csdnimg.cn/img_convert/83e8e89faeb2472194e56a07cc883464.png)
构造类型
![](https://img-blog.csdnimg.cn/img_convert/e12f7593e05449e2b7ad2b422505fb7f.png)
指针类型
![](https://img-blog.csdnimg.cn/img_convert/b7434a32cff143fe9b3750f43f154f77.png)
空类型
空类型以void来表示通常出现在函数中以返回值或者是参数的形式出现。
2.整形在内存中的存储
首先,指针是以字节为单位的,也就是说一个指针编号对应的是一个字节大小的空间,而整形的空间大小为四个字节,
int a=200;
我们设置一个int类型的a变量,通过调试验证它所占的字节大小。
![](https://img-blog.csdnimg.cn/img_convert/c6f225822eed4eeb8faac0d441cd3680.png)
16进制中0xc8等于200,进一步验证了int类型占据四个字节。
2.1原码,反码,补码。
三种存储的方法是相同的,最前面的一位通过0和1来表示正负。
看到上面变量的例子,我们会有一个疑问为什么a变量会在计算机中被操作为c8 00 00 00。
我们知道在计算机中所有数据都是以0和1来存储的,而一个16进制的数字是由4为2进制的数字表达的。
1111=15,而16进制中位上最大的数就是15。
我们来演示一遍a的存储过程,首先,计算机根据int开辟的四个字节的空间。
![](https://img-blog.csdnimg.cn/img_convert/4914e8952f9c48b188292b84b5179542.png)
呢么a要是等于-200呢?
![](https://img-blog.csdnimg.cn/img_convert/804b054e1b774bb488e478c8f95f2db8.png)
![](https://img-blog.csdnimg.cn/img_convert/ba8d4249ee4e41d18161a349b100ec44.png)
我们也可以看到计算机显示的数据大小也与补码相同。
最后存放到计算机中的二进制顺序就是我们的补码。这个就是我们的变量如何转化位计算机中的存储信息的过程。通过原码,反码,补码的转换,当我们需要从计算机中提取a的值的话就将补码转化位原码读取大小即可。
3.大小端的原理
当看到a=200的时候不知道大家会不会有所疑惑为什么c8应该是最低数字位却出现在了最低的储存字节上?呢我们可以让c8出现在相对高一点的位置呢?
答案是可以的,我们只需要告诉计算机我们的存储方式是大端存储还是小端存储就可以了。
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地
址中
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元
都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short
型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32
位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因
此就导致了大端存储模式和小端存储模式。
例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为
高字节, 0x22 为低字节。对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高
地址中,即 0x0011 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则
为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式
还是小端模式。
经过上面简单的科普后,我仍以a来举例按照16进制的方式来看的话,200就可以换算成
0x00 00 00 c8,c8就是我们的数据的地位。
![](https://img-blog.csdnimg.cn/img_convert/c6f225822eed4eeb8faac0d441cd3680.png)
我们可以看到c8对应的是低地址,呢么这个程序就是在小端机器上运行的。大端反之。
4.%d %u unsigned提取数据的差别
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
当整形数据要存放在char类型的变量中时,需要截断最后的八位存放。
如果是unsigned类型的话,不管符号位前面全部补0
如果是signed根据符号位补数字(charx类型的符号位就是截取出的第一个符号位根据它来补数字)
%u就是将补码直接当原码输出
5.浮点数的存储
3.14159
1E10
浮点数家族包括: float、double、long double 类型。
浮点数表示的范围:float.h中定义
5.1浮点数的储存规则
浮点数只存三个数据分别为S,M,E
float a=5.5;
通过a来展现浮点数是如何存储的,还是以二进制的方式存储。
5.5以二进制转换为101.1(小数点后为2的负指数次)
S是表示变量的正负,-1的0次为正S=0,1次为负,S=1
将小数点向前移动为1.xxxx*2指数次
M=1.xxxxxxxx中xxxxxxx,读取时自动补1
,E=指数的大小
![](https://img-blog.csdnimg.cn/img_convert/9fd828e753fc448fbd778775a481bc9f.png)
内存以此储存。
5.2E为一个无符号整数(unsigned int)
这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们
知道,科学计数法中的E是可以出
现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数
是127;对于11位的E,这个中间
数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即
10001001
当E不全为1或0时将E的计算值减去127后为指数
当E全为1时就当作无穷大数
当E全为0时就为0.xxxxx的数字
创作不易,请留下你的赞吧!十分感谢。