【维生素C语言】第九章 - 数据的存储(一)

简介: 本章将学习C语言数据的存储,对数据类型进行详细的介绍。正式讲解原码、反码、补码,以及大小端等知识,还会对浮点数的存储进行一个探讨,介绍IEEE754规定。


9f85917a8f7021b22dcd0921bff9bd49_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png

前言


本章将学习C语言数据的存储,对数据类型进行详细的介绍。正式讲解原码、反码、补码,以及大小端等知识,还会对浮点数的存储进行一个探讨,介绍IEEE754规定。


一、数据类型介绍


0x00 内置类型

936c56538e5ec6f243df3b61ad3e11cf_2021060916174152.png

0x01 类型的意义

📚 意义:


     ① 类型决定开辟内存空间的大小(大小决定了使用的范围)


     ② 类型决定了看待内存空间的视角


二、类型的基本归类


0x00 整型家族

b15cc6b6841a00a00c6a2afbbc660b1a_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png

❓ 为什么 char 算整型:


因为字符类型底层存储的是 ASCII 码值,而ASCII码值也是整数,所以在归类的时候会把 char 类型归结到整型家族里去。( ASCII码:美国信息交换标准代码 )


(有符号类型和无符号类型本文后续会详细讲解)


0x01 浮点型家族

896c42e6db0fbe77c1982a8929aa56f3_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png

0x02 构造类型

2fbf7fcec07eadf6ef01d08e911e0216_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png

📚 定义:构造类型又叫自定义类型,是我们自己创建的类型;


📌 注意事项:他们都是整型数组,但是他们的类型完全不一样


int arr[10]; 👉 类型为:int[10]
int arr2[5]; 👉 类型为:int[5]

0x03 指针类型

7281027b14821b2cc3242d1441811620_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png

0x04 空类型

004624fb376f86639bfcb187fe5a7815_20210610082454152.png

📚 void 表示空类型(无类型),通常应用于函数的返回类型、函数的参数、指针类型


💬 void 定义函数返回类型和函数参数:


void test(void) // 不需要返回值的函數
{
    printf("hehe\n");
}
int main(void)
{
    test(); // test(100) error 函数内声明的是无参
    return 0;
}

💬 void 定义空指针:


void* p

三、整型在内存中的存储


0x00 引入

266cc72d0d68f1ad8ceef1960aaaebf2_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png

📚 数据在内存中以2进制的形式存储:


     ① 对于整数来说,内存中存储的二进制有3种表示形式:原码、反码、补码


     ② 正整数:原码、反码、补码相同


     ③ 负整数:原码、反码、补码要进行计算


0x01 原码

📚 原码:按照数据的数值直接写出的二进制序列就是原码

767a25c17c09adf5605bead3999e8062_20210610092619788.png

❗   符号位:最高位1表示负数,最高位0表示正数


0x02 反码

📚 反码:原码的符号位不变,其他位按位取反,即为反码

96aa334ea10ccbaa2b3e3f844fb3f987_20210610093123153.png

0x03 补码

📚 补码:反码 +1,得到的就是补码

ae99bb308e8f03da43b190b7ad269f32_20210610093420145.png

0x04 内存中为何存放补码

此时我们再看前面引入里提到的:


📚 虽然整数的二进制表示形式有三种,但是内存中存储的是补码

1e2052ea73144090a0625fc9854da9b0_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png


🔺 结论:整数在内存中存储的是补码


❓  为什么在内存中存的是补码呢:


在计算机系统中,整数数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数字域统一处理;同时,加法和减法也可以统一处理( CPU只有加法器 )。此外,补码与补码相互转换,其运算过程是相同的,不需要额外的硬件电路。


相关文章
|
21天前
|
存储 编译器 程序员
【C语言】整形数据和浮点型数据在内存中的存储
【C语言】整形数据和浮点型数据在内存中的存储
12 0
|
1月前
|
存储 小程序 C语言
【深度剖析数据在内存中的存储】C语言
【深度剖析数据在内存中的存储】C语言
|
1月前
|
存储 C语言
C语言——数据输入和输出
C语言——数据输入和输出
12 0
|
1月前
|
存储 小程序 C语言
【C语言进阶】深度剖析数据在内存中的存储
【C语言进阶】深度剖析数据在内存中的存储
|
1月前
|
存储 编译器 C语言
C语言巧用联合体union判定数据的存储格式(大小端)
C语言巧用联合体union判定数据的存储格式(大小端)
12 1
|
1月前
|
C语言
C语言中printf函数输出数据
C语言中printf函数输出数据
16 0
|
6月前
|
缓存 C语言
C语言——数据的输入输出
C语言——数据的输入输出
|
C语言
C语言 字符数据输入输出
C语言 字符数据输入输出
C语言 字符数据输入输出
|
存储 C语言
初识C语言之数据输入输出篇——带你领略编程世界的文字艺术!
初识C语言之数据输入输出篇——带你领略编程世界的文字艺术!
133 0
初识C语言之数据输入输出篇——带你领略编程世界的文字艺术!
|
C语言 Web App开发