深度剖析 —— 数据

📅 2026/8/13 16:43:14
深度剖析 —— 数据
系列文章目录深度剖析数据深度剖析递归深度剖析结构体深度剖析动态内存管理深度剖析文件操作深度剖析预处理文章目录系列文章目录前言参考资料一、数据是什么二、数据类型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 double2.转换规则若参与运算量的类型不同则先转换成同一类型然后进行运算转换按数据长度增加的方向进行以保证精度不降低。如int型和long型运算时先把int量转成long型后再进行运算。若两种类型的字节数不同转换成字节数高的类型。若两种类型的字节数相同且一种有符号一种无符号则转换成无符号类型所有的浮点运算都是以双精度进行的即使是两个float单精度量运算的表达式也要先转换成double型再作运算char型和short型参与运算时必须先转换成int型在赋值运算中赋值号两边量的数据类型不同时赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时将丢失一部分数据这样会降低精度四.源码反码补码1.二进制的最左边最高位第一位: 0 代表正1 代表负2.只要是整数二进制储存的都是补码3.正数原码、反码、补码相同4.负数 以-2为例原码:10000000000000000000000000000010反码:11111111111111111111111111111101(最高位符号位不变其它位取反)补码:11111111111111111111111111111110(在反码的基础上1)5.内存正负分配原理 (-1 与 0 左右各占一半趋于中心)补码:000000000000000000000000000000000补码:向中间最大值逼近 补码:max01111111111111111111111111111111补码:分水岭:最大值1最小值 补码:min10000000000000000000000000000000补码:向中间最小值逼近 补码:-111111111111111111111111111111111五.大小端存储存储: int a 0x112233441.大端字节序把数据的低位字节序的内容存放在高地址处高位字节序的内容存放在低地址处低地址------------------11223344-------------------高地址2.小段字节序把数据的低位字节序的内容存放在低地址处高位字节序的内容存放在高地址处低地址------------------44332211-------------------高地址六.浮点数(IEEE754)1.二进制的储存(-1)^S * M * 2^E (二进制下科学记述法形式)S(符号): 0为正1为负M(尾数): 小数点后的数小数点前面1不储存1.会自动补齐尾数不足自动补0E(阶码): 科学技术法的几次方0次方为127: 01111111(-1)^s表示符号位当s0V为正数当s1V为负数。M表示有效数字大于等于1小于2。2^E表示指数位。源码:0(符号位)01111111(E)00000000000000000000000(M)float a 5.5二进制形式:101.1S0;E2127;M1.011;二进制:01000000101100000000000000000000二进制:01000000101100000000000000000000十六进制:40b000002.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则正好是非规格化的-1263.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则正好是非规格化的2544.E全为1时 M不全为0时表示: NaN(未定义或不可表示的值)总结C语言有多种数据类型基本数据类型分为两大类: 整数类型和浮点数类型通过类型分配的存储量和有无符号衍生出许多其他数据类型。整型又可以以二进制的方式通过补码的形式存储在内存单元浮点数则用的是IEEE754的浮点数存储标准进行存储。数据在C语言中有着极其重要的地位非常值得深入了解学习本文如出现错误欢迎指点交流。