1. 数据类型介绍
我们首先要了解C语言中都有哪些数据类型。
整形家族:
char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long
浮点型家族
float
double
构造类型
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型
int *pi;
char *pc
float *pf
void *pv
空类型
void 表示空类型(无类型)
通常用于函数的返回类型、函数的参数、指针类型等。
2.整形在内存中的存储
首先我们要知道变量在内存中存储是需要开辟空间的,而空间的大小由不同的数据类型决定的。
那数据到底在内存中是如何存储的。
我们需要了解以下三个概念:原码 反码 补码。
三种表示方法均有符号位,数值位,符号位‘0’表示正,‘1’表示负。
原码
直接将数值按照正负数的形式翻译成二进制。
反码
符号数不变,其他位依次按位取反。
补码
反码加一,即可得到补码。
正数的原,反,补相同。
对于整形来说,数据存放内存中的其实是补码。
例如:
我们可以看到a , b 分别存储的是补码。
但是顺序有些异常。
这里我们必须提到 大端字节序和 小端字节序的概念了。
3.大小端字节序
大端字节序:大端存储模式 ,指的是数据的低位保存在内存的高地址处,数据的高位保存在内存的低地址处。
小端字节序:小端存储模式 ,指的是数据的低位保存在内存的低地址处,数据的高位保存在内存的高地址处。
机器的字节序是大端还是小端,这要看具体的机器。
我们可以用一个程序来判断当前程序的字节序
设 i 为 1。
二进制为 00000000 00000000 00000000 00000001
大端字节序 00 00 00 01
小端字节序 01 00 00 00
取地址 i 再使用(char*)强制类型转换,再解引用,访问第一个字节内容,进而判断字节序。
4.浮点型在内存中的存储
储存规则
浮点型的储存规则与整形截然不同,有本质的区别。
根据国际标准IEEE,任意一个二进制浮点数V可以表示为:
(-1)^S*M*2^E
(-1)^S表示符号位,S=0时,V为正数,S = 1时,V为负数。
M表示有效数字,大于等于1,小于2
2^E表示指数位
例如十进制的 6 二进制为110,(-1)^0*1.10*2^2
IEEE规定
对于32位的浮点数,最高位是符号位S,紧接着的8位是指数E,剩下的23位为有效数字M
对于64位浮点数,最高位是符号位S,紧接着11位是指数E,剩下的52位是有效数字。
IEEE对于有效数字M和指数E,还有一些特殊规定,解释起来有些繁琐,简单说一下结论,有兴趣可自行了解。
IEEE 754规定:在计算机保存M时,默认第一位为1,因此可被省,等到读取时直接再补上,这样可以保存更多的有效数字。
指数E 为无符号整数(unsigned int )
科学计数法中E存在负数,所以规定存入内存中必须加上一个中间数,127(32位),1023(64位)。
取出E时。
E不为全0 或全1时,E 减去127(1023)
E为全0时,E等于1-127(1-1023)
有效数字不再加上第一位的1,而是0.xxxxxxxx的小数,表示正负0或者接近0的小数。
E为全1时 :如果有效数字全为0,表示正负无穷大。