前言
本章将学习C语言数据的存储,对数据类型进行详细的介绍。正式讲解原码、反码、补码,以及大小端等知识,还会对浮点数的存储进行一个探讨,介绍IEEE754规定。
一、数据类型介绍
0x00 内置类型
0x01 类型的意义
📚 意义:
① 类型决定开辟内存空间的大小(大小决定了使用的范围)
② 类型决定了看待内存空间的视角
二、类型的基本归类
0x00 整型家族
❓ 为什么 char 算整型:
因为字符类型底层存储的是 ASCII 码值,而ASCII码值也是整数,所以在归类的时候会把 char 类型归结到整型家族里去。( ASCII码:美国信息交换标准代码 )
(有符号类型和无符号类型本文后续会详细讲解)
0x01 浮点型家族
0x02 构造类型
📚 定义:构造类型又叫自定义类型,是我们自己创建的类型;
📌 注意事项:他们都是整型数组,但是他们的类型完全不一样
int arr[10]; 👉 类型为:int[10] int arr2[5]; 👉 类型为:int[5]
0x03 指针类型
0x04 空类型
📚 void 表示空类型(无类型),通常应用于函数的返回类型、函数的参数、指针类型
💬 void 定义函数返回类型和函数参数:
void test(void) // 不需要返回值的函數 { printf("hehe\n"); } int main(void) { test(); // test(100) error 函数内声明的是无参 return 0; }
💬 void 定义空指针:
void* p
三、整型在内存中的存储
0x00 引入
📚 数据在内存中以2进制的形式存储:
① 对于整数来说,内存中存储的二进制有3种表示形式:原码、反码、补码
② 正整数:原码、反码、补码相同
③ 负整数:原码、反码、补码要进行计算
0x01 原码
📚 原码:按照数据的数值直接写出的二进制序列就是原码
❗ 符号位:最高位1表示负数,最高位0表示正数
0x02 反码
📚 反码:原码的符号位不变,其他位按位取反,即为反码
0x03 补码
📚 补码:反码 +1,得到的就是补码
0x04 内存中为何存放补码
此时我们再看前面引入里提到的:
📚 虽然整数的二进制表示形式有三种,但是内存中存储的是补码
🔺 结论:整数在内存中存储的是补码
❓ 为什么在内存中存的是补码呢:
在计算机系统中,整数数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数字域统一处理;同时,加法和减法也可以统一处理( CPU只有加法器 )。此外,补码与补码相互转换,其运算过程是相同的,不需要额外的硬件电路。