一、数据类型
1、整型数据
char--unsigned char signed char---1字节
short--unsigned short signed short--2字节
int -- unsigned int signed int---4/8字节(取决于32位/64位编译器)
long -- unsigned long signed long--4字节
2、浮点型数据
float --4字节
double--8字节
3、自定义类型
数组类型
结构体类型 struct
枚举类型enum
联合类型 union
4、指针类型--4/8字节(取决于32位/64位编译器)
整型指针 int*pi
字符型指针 char *pc
浮点型指针 float*pf
空指针 void* pv
二、数据在内存中的存储
1、整型数据在内存中的存储
整型数据二进制表示方法分为三种:原码,反码和补码。
整型数据在内存中以补码的形式存储!
正整数的原码、反码和补码相同。
例如:int a = 10;
负整数的原码、反码和补码需要计算。
整型数据在内存中以补码的形式存储!为什么呢?
因为如果使用原码进行计算得到的结果是错误的,而使用补码计算结果正确。下面举例说明:
展示计算机计算(1-1)的过程:
知识点1:CPU上只有加法运算器,因此计算1-1要转化为1+(-1)
①使用原码计算过程
②使用补码计算的过程
三、大小端字节序
1、字节序
字节序是以字节为单位,讨论存储的顺序
2、小端字节序存储:
低位字节内容 -----> 低地址处
高位字节内容 ------> 高地址处
例如:int a = 4;VS编译器中16进制显示为0x00000004,
高位 低位
低位的04放入低 地址处,高位的00放入高地址处。
3、大端字节序存储
低位字节内容 -----> 高地址处
高位字节内容 ------> 低地址处
例如:int a = 4;VS编译器中16进制显示为0x00000004,
低位的04放入低高地址处,高位的00放入低地址处。
4、编写代码判断计算机是大端字节序还是小端字节序
#include<stdio.h>
int main()
{
int a = 1;
char* p = (char*)&a;//强制类型转换
*p = 0;
if (a)
{
printf("大端");
}
else
{
printf("小端");
}
return 0;
}
五、有符号数和无符号数的存储
涉及到整型提升和算术转换
1、char--表示有符号数还是无符号数取决于编译器
①signed char
②unsigned char
2、short
①signed short
②unsigned short
3、int
同理可得。
4、整型提升例题
六、浮点型数据在内存中的存储
IEEE754规定:任何一个浮点数V都可以表示为:
V=(-1)^S*M*2^E
◆S为0表示正数,1表示负数
◆M为有效数字
◆2^E表示指数维
例:5.5-----10进制表示的浮点数
101.1-----2进制表示的浮点数(1*2^2+0*2^1+1*2^0+1*2^(-1)=5.5)
=1.011*2^2
◆S=1(正数)
◆E = 2
◆M = 1.011
因此,浮点型数据的存储只要存S,M,E即可
S以0或1存入第一高位,E+127存入后面8个比特位,M去掉小数点前的1后存入后面23位。
用例子进一步说明:
#include<stdio.h>
int main()
{
int n = 9;
float* pf = (float*)&n;
printf("n的值为:%d\n", n);
printf("*pf的值为:%f\n", *pf);
*pf = 9.0;
printf("n的值为:%d\n", n);
printf("*pf的值为:%f\n", *pf);
return 0;
}
打印结果为:
why!
读取时的特殊情况:
1、E的8个比特位为全0时,规定E为1-127=-126,有效数字M小数点前不再补1,而是补0变成0.xxxxx,表示的浮点数无限接近于0.
2、E的8个比特位为全1时,,表示±无穷大。