目录
常见内置数据类型介绍:
char //字符数据类型
short // 短整型int // 整形long // 长整型long long // 更长的整形float //单精度浮点数double // 双精度浮点数
一、数据类型的归类
1.整形:
注:[ ]中的 int 可以省略
看到这里想必很多人会产生疑惑:咦,(unsigned、signed)char 不是字符类型吗?为什么会归于整形这一类嘞?
其实:字符在内存中存储的其实是对应的ASCII码值,ASCII码值是整型所以就将字符类型归类到了整形家族里面去。
另外:switch-case语句的使用,因为switch (表达式),表达式只能是整型类型。
这也辅证了char归于整形类型的:
2.浮点数:
只有俩:
float
double
那么都是浮点数,float、double又有什么区别呢?那么请继续往下看吧。
3.构造类型
> 数组类型> 结构体类型 struct> 枚举类型 enum> 联合类型 union
4.指针类型
int * pi ;char * pc ;float* pf ;void* pv ;
5.空类型
二、大小端介绍
计算机能够处理的是二进制的数据,那么一个整数对应的二进制序列在内存中存放时,理论上就能产生多种存储方式,除开不合理的方式,那么就只剩两种有序的存储方式了:①大端模式、②小端模式。
![](https://img-blog.csdnimg.cn/7193cea9194146f0b19260dd4e9d8c46.png)
那接下来如何证明具体是哪一种模式呢?以下面为例:
int a = 1; //00000000 00000000 00000000 00000001
通过内存监视窗口我们发现 a在内存中是这样存储的:
当然我们也可以根据大小端的概念实现检测:由以下代码,实现访问a的地址的第一个字节,由结果可知,第一个字节存的是1,也就是小端存储模式
三、整型在内存中的存储
1、原码、补码、反码
①计算机中的整数有三种 2 进制表示方法,即原码、反码和补码。②三种表示方法均有 符号位 和 数值位 两部分,符号位都是用 0 表示 “ 正 ” ,用 1 表示 “ 负 ”。③正数:原码、补码、反码 相同
④负数:原码、反码、补码要进行计算(其中:原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。
补码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
反码:反码+1就得到补码。)
⑤整数在在内存中存储的是<补码>的二进制序列
#include <stdio.h>
int main()
{
int a = -10;//4个字节,32位
//原码:10000000 00000000 00000000 00001010
// 第一位为符号位,其余为数值位
//反码:11111111 11111111 11111111 11110101
//补码:11111111 01111111 11111111 11110110 ---(内存中存的这个)
unsigned int b = -10;
//补码:11111111 01111111 11111111 11110110
//全是有效位,没有符号位
}
2.整型练习
了解了整型在内存中的存储后,不妨做下面一道练习题:请猜测打印结果!
int main()
{
char a = -1;
//10000000 00000000 00000000 00000001
//11111111 11111111 11111111 11111110
//11111111 11111111 11111111 11111111
//11111111 - a
signed char b = -1;
//11111111 - b
unsigned char c = -1;
//11111111 - c
//
printf("a=%d,b=%d,c=%d", a, b, c);
//%d 是10进制的形式打印有符号的整数(此处存在整形提升)
//11111111111111111111111111111111 - a
//11111111111111111111111111111111 - b
//00000000000000000000000011111111 - c
//
return 0;
}
实际上,上述代码运行结果为:a=-1,b=-1,c=255 你算对了吗?
四、浮点数在内存中的存储
1.浮点数的表示方法
国际标准IEEE(电气电子工程师学会)754规定,任意一个浮点数 V 都能以下面这种方式表示:
V = (-1)^S * M * 2^E其中:①(-1)^S 表示符号位,当 S=0,V为正数;当S=1,V为负数。②M表示有效数字,其中 1<=M<2③2^E 表示指数位。其中 E是一个无符号整数(unsigned int)
例如:
十进制的5.0,写成二进制是101.0,相当于1.01×2^2。其中:S=0,M=1.01,E=2。
另外:
IEEE规定:对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
而对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
![](https://img-blog.csdnimg.cn/4346864cde034d49bd0beefcbff60e70.png)
2.有效数字M和指数E-----特别规定。
(1)M
因为1<=M<2,故M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的 xxxxxx部分。
比如保存1.01的时 候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位, 将第一位的1舍去以后,等于可以保存24位有效数字。
(2)E不全为0或不全为1
![](https://img-blog.csdnimg.cn/b6a7dfefbbc149e8954e75784ded6e68.png)
(3)E全为0
(4)E全为1
3.浮点数例题
请给出下列代码的运行结果:
int main()
{
int n=9;
float*pFloat= (float*)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat=9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}
公布答案:你想对了吗?