深度剖析 —— 数据

系列文章目录

深度剖析:数据
深度剖析:递归
深度剖析:结构体
深度剖析:动态内存管理
深度剖析:文件操作
深度剖析:预处理


文章目录

  • 系列文章目录
  • 前言
  • 参考资料
  • 一、数据是什么?
  • 二、数据类型
    • 1.整型
    • 2.浮点型
    • 3.构造类型
    • 4.指针类型
    • 5.空类型
  • 三.混合运算与类型转换
    • 1.转换等级
    • 2.转换规则
  • 四.源码反码补码
  • 五.大小端存储
    • 1.大端字节序
    • 2.小段字节序
  • 六.浮点数(IEEE754)
    • 1.二进制的储存
    • 2.E全为0时 M为任意值时
    • 3.E全为1时 M全为0时
    • 4.E全为1时 M不全为0时
  • 总结


前言

众所周知计算机在我们的的生活中十分强大,但“巧妇难为无米之炊”计算机再强大没有“米”也终归是毫无用处,这里的“米”便是数据


参考资料

《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.转换规则

  1. 若参与运算量的类型不同,则先转换成同一类型,然后进行运算

  2. 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。若两种类型的字节数不同,转换成字节数高的类型。若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型

  3. 所有的浮点运算都是以双精度进行的,即使是两个float单精度量运算的表达式,也要先转换成double型,再作运算

  4. char型和short型参与运算时,必须先转换成int型

  5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度

四.源码反码补码

1.二进制的最左边最高位第一位: 0 代表正;1 代表负

2.只要是整数二进制储存的都是补码

3.正数原码、反码、补码相同

4.负数 以-2为例

原码: 10000000000000000000000000000010
反码: 11111111111111111111111111111101 (最高位符号位不变,其它位取反)
补码: 11111111111111111111111111111110 (在反码的基础上+1)

5.内存正负分配原理 (-1 与 0 左右各占一半,趋于中心)

补码:   0 = 00000000000000000000000000000000
补码:   向中间最大值逼近
补码: max = 01111111111111111111111111111111
补码: 分水岭: 最大值+1 == 最小值
补码: min = 10000000000000000000000000000000
补码:   向中间最小值逼近
补码:  -1 = 11111111111111111111111111111111

五.大小端存储

深度剖析 —— 数据_第1张图片

存储: int a = 0x11223344

1.大端字节序

把数据的低位字节序的内容存放在高地址处,高位字节序的内容存放在低地址处

低地址------------------11 22 33 44-------------------高地址

深度剖析 —— 数据_第2张图片

2.小段字节序

把数据的低位字节序的内容存放在低地址处,高位字节序的内容存放在高地址处

低地址------------------44 33 22 11-------------------高地址

深度剖析 —— 数据_第3张图片

六.浮点数(IEEE754)

1.二进制的储存

  1. (-1)^S * M * 2^E (二进制下科学记述法形式)
  2. S(符号): 0为正,1为负
  3. M(尾数): 小数点后的数,小数点前面1不储存,1.会自动补齐,尾数不足自动补0
  4. E(阶码): 科学技术法的几次方,0次方为127: 01111111
  5. (-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
  6. M表示有效数字,大于等于1,小于2。
  7. 2^E表示指数位。
  8. 源码: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为任意值时

  1. 表示: 正负0 (即0.1xxxx*-126)
  2. 二进制: 0 00000000 xxxxxxxxxxxxxxxxxxxxxxx
  3. 这时,浮点数的指数E等于1-127(或者1-1023)即为非规格化的-126(或者-1022)
  4. 有效数字M不再加上第一位的1,而是还原为0.1xxxxxx的小数(即为非规格化)
  5. 这样做是为了表示±0,以及接近于0的很小的数字。
  6. 作为补偿,尾数右移一位舍缩小含的“1”,同时阶码逻辑上+1
  7. 来表示被覆盖的1.0^-127。阶码+1则正好是非规格化的-126

3.E全为1时 M全为0时

  1. 表示: 正负无穷大 (即10.0000*254)
  2. 二进制: 0 11111111 00000000000000000000000
  3. 这时,浮点数的指数E等于255-1(或者2047-1)即为非规格化的 254(或者 2046)
  4. 有效数字M不再加上第一位的1,而是还原为 10.00000的小数(即为非规格化)
  5. 作为补偿,尾数左移一位放大隐含的“1”,同时阶码逻辑上-1
  6. 来表示被覆盖的1.0^255。阶码+1则正好是非规格化的254

4.E全为1时 M不全为0时

  1. 表示: NaN(未定义或不可表示的值)

总结

C语言有多种数据类型,基本数据类型分为两大类: 整数类型和浮点数类型,通过类型分配的存储量和有无符号,衍生出许多其他数据类型。整型又可以以二进制的方式通过补码的形式存储在内存单元,浮点数则用的是IEEE754的浮点数存储标准进行存储。数据在C语言中有着极其重要的地位,非常值得深入了解学习,本文如出现错误欢迎指点交流。

你可能感兴趣的:(C语言,c语言,c++,数据结构)