系列文章目录
深度剖析:数据
深度剖析:递归
深度剖析:结构体
深度剖析:动态内存管理
深度剖析:文件操作
深度剖析:预处理
文章目录
前言
众所周知计算机在我们的的生活中十分强大,但“巧妇难为无米之炊”计算机再强大没有“米”也终归是毫无用处,这里的“米”便是数据
参考资料
《C Primer Plus》
《C和指针》
《大话数据结构》
一、数据是什么?
数据:是描述客观事物的符号, 是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括数值类型,还包括图像、视频、声音等非数值类型。
常量(constant):预先设定好,在整个程序的运行中没有变化。
变量(variable):在程序运行期间可能改变或被赋值。
二、数据类型
1.整型
关键字 | 类型 |
---|---|
char | 字符数据类型 |
short | 短整型 |
int | 整型 |
long | 长整型 |
long long | 更长的整形 |
unsigned | 无符号类型 |
2.浮点型
注意:浮点型必须有符号位,不可以写成unsigned
关键字 | 类型 |
---|---|
float | 单精度浮点数 |
double | 双精度浮点数 |
3.构造类型
关键字 | 类型 |
---|---|
arr[n] | 数组类型 |
struct | 结构体类型 |
enum | 枚举类型 |
union | 联合类型 |
4.指针类型
关键字 | 类型 |
---|---|
int *pi | 整型指针 |
char *pc | 字符指针 |
float* pf | 浮点型指针 |
void* pv | 无类型指针 |
5.空类型
关键字 | 类型 |
---|---|
void | 无类型 |
注:通常应用于函数的返回类型、函数的参数、指针类型
三.混合运算与类型转换
1.转换等级
int < unsigned int < long < unsigned long < float < double < long double
2.转换规则
-
若参与运算量的类型不同,则先转换成同一类型,然后进行运算
-
转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。若两种类型的字节数不同,转换成字节数高的类型。若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
-
所有的浮点运算都是以双精度进行的,即使是两个float单精度量运算的表达式,也要先转换成double型,再作运算
-
char型和short型参与运算时,必须先转换成int型
-
在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度
四.源码反码补码
1.二进制的最左边最高位第一位: 0 代表正;1 代表负
2.只要是整数二进制储存的都是补码
3.正数原码、反码、补码相同
4.负数 以-2为例
原码: 10000000000000000000000000000010
反码: 11111111111111111111111111111101 (最高位符号位不变,其它位取反)
补码: 11111111111111111111111111111110 (在反码的基础上+1)
5.内存正负分配原理 (-1 与 0 左右各占一半,趋于中心)
补码: 0 = 00000000000000000000000000000000
补码: 向中间最大值逼近
补码: max = 01111111111111111111111111111111
补码: 分水岭: 最大值+1 == 最小值
补码: min = 10000000000000000000000000000000
补码: 向中间最小值逼近
补码: -1 = 11111111111111111111111111111111
五.大小端存储
存储: int a = 0x11223344
1.大端字节序
把数据的低位字节序的内容存放在高地址处,高位字节序的内容存放在低地址处
低地址------------------11 22 33 44-------------------高地址
2.小段字节序
把数据的低位字节序的内容存放在低地址处,高位字节序的内容存放在高地址处
低地址------------------44 33 22 11-------------------高地址
六.浮点数(IEEE754)
1.二进制的储存
- (-1)^S * M * 2^E (二进制下科学记述法形式)
- S(符号): 0为正,1为负
- M(尾数): 小数点后的数,小数点前面1不储存,1.会自动补齐,尾数不足自动补0
- E(阶码): 科学技术法的几次方,0次方为127: 01111111
- (-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
- M表示有效数字,大于等于1,小于2。
- 2^E表示指数位。
- 源码:0(符号位)01111111(E)00000000000000000000000(M)
float a = 5.5
二进制形式: 101.1
S = 0; E = 2 + 127; M = 1.011;
二进制: 0 10000001 01100000000000000000000
二进制: 0100 0000 1011 0000 0000 0000 0000 0000
十六进制: 40 b0 00 00
2.E全为0时 M为任意值时
- 表示: 正负0 (即0.1xxxx*-126)
- 二进制: 0 00000000 xxxxxxxxxxxxxxxxxxxxxxx
- 这时,浮点数的指数E等于1-127(或者1-1023)即为非规格化的-126(或者-1022)
- 有效数字M不再加上第一位的1,而是还原为0.1xxxxxx的小数(即为非规格化)
- 这样做是为了表示±0,以及接近于0的很小的数字。
- 作为补偿,尾数右移一位舍缩小含的“1”,同时阶码逻辑上+1
- 来表示被覆盖的1.0^-127。阶码+1则正好是非规格化的-126
3.E全为1时 M全为0时
- 表示: 正负无穷大 (即10.0000*254)
- 二进制: 0 11111111 00000000000000000000000
- 这时,浮点数的指数E等于255-1(或者2047-1)即为非规格化的 254(或者 2046)
- 有效数字M不再加上第一位的1,而是还原为 10.00000的小数(即为非规格化)
- 作为补偿,尾数左移一位放大隐含的“1”,同时阶码逻辑上-1
- 来表示被覆盖的1.0^255。阶码+1则正好是非规格化的254
4.E全为1时 M不全为0时
- 表示: NaN(未定义或不可表示的值)
总结
C语言有多种数据类型,基本数据类型分为两大类: 整数类型和浮点数类型,通过类型分配的存储量和有无符号,衍生出许多其他数据类型。整型又可以以二进制的方式通过补码的形式存储在内存单元,浮点数则用的是IEEE754的浮点数存储标准进行存储。数据在C语言中有着极其重要的地位,非常值得深入了解学习,本文如出现错误欢迎指点交流。