数据类型介绍
char | short | int | long |
浮点数家族
float | double |
构造类型
数组类型 | 结构体类型(struct) | 枚举类型(enum) | 联合类型(union) |
指针类型
int * pi | char * pc | float * pf | void * pv |
空类型
void表示空类型(无类型),通常应用于函数的返回类型、函数的参数、指针类型。 |
整形在内存中的存储
int main()
{
int num1 = 10; //创建一个整型变量。叫num1,这时向内存申请4个字节来存放数据。
//4个字节-32个比特位
//00000000000000000000000000001010-原码
//00000000000000000000000000001010-反码
//00000000000000000000000000001010-补码
int num2 = -10;
//00000000000000000000000000001010-原码
//11111111111111111111111111110101-反码
//11111111111111111111111111110110-补码
return 0;
}
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位
,
,保存在内存的高地
址中。
|
1、字节序 - 是以字节为单位,讨论存储顺序的。
2、小端字节存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容,存放在高地址处。
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;
}
补充:%d--打印有符号的数,结果是10进制的
%u--打印无符号的数,结果是10进制的
浮点数存储规则
根据国际标准
IEEE
(电气和电子工程协会)
754
,任意一个二进制浮点数
V
可以表示成下面的形式
|
(-1)^S * M * 2^E
(-1)^s
表示符号位,当
s=0
,
V
为正数;当
s=1
,
V
为负数。
M
表示有效数字,大于等于
1
,小于
2
。
2^E
表示指数位。
|
举例说明:1、十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2 。那么,按照上面V的格 式,可以得出s=0,M=1.01,E=2。
2、十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。那么,s=1,M=1.01, E=2。
![](https://img-blog.csdnimg.cn/583ba826126541a689890eb7c0a6b7c9.png)
现在对上面那个题进行分析:
第一个值:n以整数的形式放进去,再以整数的形式拿出打印,所以n=9。
第二个值:将 0x00000009 拆分,得到第一位符号位s=0,后面8位 的指数 E=00000000,最后23位的有效数字 M=000 0000 0000 0000 0000 1001。由于指数E全为0,所以是第二种情况。因此,V是一个很小的接近于0的正数,所以用十进制小数表示就是0.000000。
第三个值:浮点数9.0换成二进制的1001.0,即1.001×2^3。s=0, M=1.001,E=3+127=130那么,第一位的符号位s=0,有效数字M等于001后面再加20个0补满23位,指数E等于3+127=130,10000010。得0 10000010 001 0000 0000 0000 0000 0000,换成十进制,就是1091567616 。
第四个值:是以浮点数的形式放进去,也是一样的拿出来。
#include <stdio.h>
int main()
{
int n = 9;
//00000000000000000000000000001001 - 9的补码
//0 00000000 00000000000000000001001
//E = 1-127 = -126
//M = 0.00000000000000000001001
//(-1)^0 * 0.00000000000000000001001 * 2^-126
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);//9
printf("*pFloat的值为:%f\n", *pFloat);//0.0
*pFloat = 9.0; //以浮点数的视角,存放浮点型的数字
//1001.0
//1.001 * 2^3
//(-1)^0 * 1.001 * 2^3
//S=0
//E=3
//M=1.001
//0 10000010 00100000000000000000000
printf("num的值为:%d\n", n); //1,091,567,616
printf("*pFloat的值为:%f\n", *pFloat); //9.0
return 0;
}