From d0a117defb84e889b244297deafd82940996a117 Mon Sep 17 00:00:00 2001 From: Aurorxa Date: Sun, 28 Jul 2024 06:39:39 +0000 Subject: [PATCH] deploy: a4f6f28888130f5e7961ca05661bc2f3799f9f8d --- 404.html | 2 +- index.html | 2 +- notes/01_c-basic/01_xdx/index.html | 4 ++-- notes/01_c-basic/02_xdx/index.html | 4 ++-- notes/01_c-basic/03_xdx/index.html | 4 ++-- notes/01_c-basic/04_xdx/index.html | 4 ++-- notes/01_c-basic/05_xdx/index.html | 4 ++-- notes/index.html | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/404.html b/404.html index baa4e43..61f5f23 100644 --- a/404.html +++ b/404.html @@ -18,7 +18,7 @@
- + \ No newline at end of file diff --git a/index.html b/index.html index bb02ee8..221abd6 100644 --- a/index.html +++ b/index.html @@ -21,7 +21,7 @@
Skip to content

许大仙同学

『这个世纪疯狂,没人性,腐败;你却一直清醒,温柔,一尘不染。』

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/01_c-basic/01_xdx/index.html b/notes/01_c-basic/01_xdx/index.html index dcc7af4..b5fdbc0 100644 --- a/notes/01_c-basic/01_xdx/index.html +++ b/notes/01_c-basic/01_xdx/index.html @@ -20,7 +20,7 @@ -
Skip to content

第一章:计算机组成原理

1.1 计算机系统

  • 计算机(Computer),俗称"电脑",是一种能够接收和存储信息,并按照存储在其内部的程序对海量的数据进行自动、高速的处理,然后将处理结果输出的现代化智能电子设备。
  • 计算机有很多形式,如:台式电脑、笔记本电脑、智能手机、平板电脑等,还有生产环境中提供重要业务支撑的各种服务器。

  • 一个完整的计算机系统硬件(Hardware)系统软件(Software)系统两大部分组成,即:

1.2 冯·诺依曼体系结构

  • 冯·诺依曼是一位多才多艺的科学家,他在数学、物理学、计算机科学、经济学等领域都有杰出的贡献。

  • 冯·诺依曼的主要成就:
    • 在计算机科学领域的最著名贡献是提出了冯·诺依曼体系结构(1946 年),这是现代计算机设计的基础
    • 促进了计算机的可编程性和通用性,使得计算机能够执行各种复杂的任务。
    • 对核武器设计、自动化控制系统、人工智能等领域的发展产生了重要影响。
    • ……

IMPORTANT

冯·诺依曼体系结构是现代计算机(量子计算机除外)设计的基础

  • 冯·诺依曼体系结构的理论要点如下:

    • 存储程序程序指令数据都存储在计算机的内存中,这使得程序可以在运行时修改。

    • 二进制逻辑:所有数据指令都以二进制形式表示。

    • 顺序执行:指令按照它们在内存中的顺序执行,但可以有条件地改变执行顺序。

    • 五大部件:计算机由运算器控制器存储器输入设备输出设备组成。

    • 指令结构:指令由操作码和地址码组成,操作码指示要执行的操作,地址码指示操作数的位置。

    • 中心化控制:计算机的控制单元(CPU)负责解释和执行指令,控制数据流。

NOTE

上述的组件协同工作,构成了一个完整的计算机系统:

  • 运算器控制器通常被集成在一起,组成中央处理器(CPU),负责数据处理和指令执行。
  • 存储器保存数据和程序,是计算机运作的基础。
  • 输入设备输出设备负责与外界的交互,确保用户能够输入信息并接收计算机的处理结果。

1.3 各种硬件处理速度和性能优化

  • 计算机的性能短板:如果 CPU 有每秒处理 1000 个服务请求的能力,各种总线的负载能力能达到 500 个, 但网卡只能接受 200个请求,而硬盘只能负担 150 个的话,那这台服务器得处理能力只能是 150 个请求/ 秒,有 85% 的处理器计算能力浪费了,在计算机系统当中,硬盘的读写速率已经成为影响系统性能进一 步提高的瓶颈。

img

  • 计算机的各个设备部件的延迟从高到低的排列,依次是机械硬盘(HDD)、固态硬盘(SSD)、内存、CPU 。

img

  • 从上图中,我们可以知道,CPU 是最快的,一个时钟周期是 0.3 ns ,内存访问需要 120 ns ,固态硬盘访问需要 50-150 us,传统的硬盘访问需要 1-10 ms,而网络访问是最慢,需要 40 ms 以上。
  • 时间的单位换算如下:
txt
1 秒 = 1000 毫秒,即 1 s = 1000 ms。
+    
Skip to content

第一章:计算机组成原理

1.1 计算机系统

  • 计算机(Computer),俗称"电脑",是一种能够接收和存储信息,并按照存储在其内部的程序对海量的数据进行自动、高速的处理,然后将处理结果输出的现代化智能电子设备。
  • 计算机有很多形式,如:台式电脑、笔记本电脑、智能手机、平板电脑等,还有生产环境中提供重要业务支撑的各种服务器。

  • 一个完整的计算机系统硬件(Hardware)系统软件(Software)系统两大部分组成,即:

1.2 冯·诺依曼体系结构

  • 冯·诺依曼是一位多才多艺的科学家,他在数学、物理学、计算机科学、经济学等领域都有杰出的贡献。

  • 冯·诺依曼的主要成就:
    • 在计算机科学领域的最著名贡献是提出了冯·诺依曼体系结构(1946 年),这是现代计算机设计的基础
    • 促进了计算机的可编程性和通用性,使得计算机能够执行各种复杂的任务。
    • 对核武器设计、自动化控制系统、人工智能等领域的发展产生了重要影响。
    • ……

IMPORTANT

冯·诺依曼体系结构是现代计算机(量子计算机除外)设计的基础

  • 冯·诺依曼体系结构的理论要点如下:

    • 存储程序程序指令数据都存储在计算机的内存中,这使得程序可以在运行时修改。

    • 二进制逻辑:所有数据指令都以二进制形式表示。

    • 顺序执行:指令按照它们在内存中的顺序执行,但可以有条件地改变执行顺序。

    • 五大部件:计算机由运算器控制器存储器输入设备输出设备组成。

    • 指令结构:指令由操作码和地址码组成,操作码指示要执行的操作,地址码指示操作数的位置。

    • 中心化控制:计算机的控制单元(CPU)负责解释和执行指令,控制数据流。

NOTE

上述的组件协同工作,构成了一个完整的计算机系统:

  • 运算器控制器通常被集成在一起,组成中央处理器(CPU),负责数据处理和指令执行。
  • 存储器保存数据和程序,是计算机运作的基础。
  • 输入设备输出设备负责与外界的交互,确保用户能够输入信息并接收计算机的处理结果。

1.3 各种硬件处理速度和性能优化

  • 计算机的性能短板:如果 CPU 有每秒处理 1000 个服务请求的能力,各种总线的负载能力能达到 500 个, 但网卡只能接受 200个请求,而硬盘只能负担 150 个的话,那这台服务器得处理能力只能是 150 个请求/ 秒,有 85% 的处理器计算能力浪费了,在计算机系统当中,硬盘的读写速率已经成为影响系统性能进一 步提高的瓶颈。

img

  • 计算机的各个设备部件的延迟从高到低的排列,依次是机械硬盘(HDD)、固态硬盘(SSD)、内存、CPU 。

img

  • 从上图中,我们可以知道,CPU 是最快的,一个时钟周期是 0.3 ns ,内存访问需要 120 ns ,固态硬盘访问需要 50-150 us,传统的硬盘访问需要 1-10 ms,而网络访问是最慢,需要 40 ms 以上。
  • 时间的单位换算如下:
txt
1 秒 = 1000 毫秒,即 1 s = 1000 ms。
 1 毫秒 = 1000 微妙,即 1 ms = 1000 us 。
 1 微妙 = 1000 纳秒,即 1 us = 1000 ns。
  • 按照上图,将计算机世界的时间和人类世界的时间进行对比,即:
txt
如果 CPU 的时钟周期按照 1 秒计算,
 那么,内存访问就需要 6 分钟;
@@ -261,7 +261,7 @@
 # requires dnsTunneling but are also OPTIONAL
 bestEffortDnsParsing=true
 useWindowsDnsCache=true

  • 在命令行中,执行如下的命令:
shell
wsl --shutdown

  • 此时,再打开终端,就没有这种提示了:

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/01_c-basic/02_xdx/index.html b/notes/01_c-basic/02_xdx/index.html index ef23a1f..5585a17 100644 --- a/notes/01_c-basic/02_xdx/index.html +++ b/notes/01_c-basic/02_xdx/index.html @@ -20,7 +20,7 @@ -
Skip to content

第一章:变量(⭐)

1.1 程序中变化的数据

  • 在生活中,我们使用最多的不是固定的数据,而是会变化的数据:
    • ① 购物车商品的数量价格等。
    • ② 一首歌播放的时间进度条歌词的展示等。
    • ③ 微信聊天中消息条数时间语音的长度头像名称等。
    • ④ 游戏中技能的冷却时间血量蓝量buff 时间金币的数量等。
    • ……
  • 下图是一个购物车变化数据,即:

  • 那么,在实际开发中,我们就会使用变量保存操作这些变化数据

1.2 变量

  • 变量的定义:变量是程序中不可或缺的组成单位,最基本的存储单元。其实,变量就是一个存储数据的临时空间,可以向其中存储不同类型的数据,如:整数、小数、字符、字符串等,并且变量中的数据在程序运行的时候可以动态改变。

NOTE

  • 变量:用来存储数据容器
  • 数据:可以是一个用来计算的数字,如:上文购物车中的价格等;也可以是一句话中的关键词其它任意格式的数据
  • 变量的特别之处就在于它存放的数据是可以改变的。
  • 我们可以将变量想象为一个容器,盒子中装的就是我们想要的数据,并且我们需要盒子一个特别的名称;通过这个特别的名称,我们可以盒子添加数据移除数据,这个特别的名称就是变量名

NOTE

  • 变量是内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化
  • ② 通过变量名,可以操作这块内存区域,向其中存储数据获取数据以及移除数据
  • ③ 变量的构成包含三个要素:数据类型变量名需要存储的数据
  • ④ 在生活中,我们会经常说:这件衣服的价格是 100(整型) 元,这双鞋子的价格是 250.5(小数,浮点类型) 元,今天天气真好(字符串类型)之类的话;在计算机科学中,这些都是数据,并且它们是有类型,即:数据类型。(数据类型用于定义变量所能存储的数据的种类以及可以对这些数据进行的操作的一种分类,每种数据类型都有特定的属性和用途,它们决定了变量在内存中如何表示和存储,以及变量可以执行哪些操作)

1.3 变量的声明和使用

  • ① 变量必须先声明,后使用。
  • ② 可以先声明变量再赋值,也可以在声明变量的同时进行赋值。
  • ③ 变量的值可以在同一类型范围内不断变化。

IMPORTANT

在实际开发中,我们通常都会在声明变量的同时,给其赋值,这被称为初始化。

  • 示例:先声明,再使用
c
#include <stdio.h>
+    
Skip to content

第一章:变量(⭐)

1.1 程序中变化的数据

  • 在生活中,我们使用最多的不是固定的数据,而是会变化的数据:
    • ① 购物车商品的数量价格等。
    • ② 一首歌播放的时间进度条歌词的展示等。
    • ③ 微信聊天中消息条数时间语音的长度头像名称等。
    • ④ 游戏中技能的冷却时间血量蓝量buff 时间金币的数量等。
    • ……
  • 下图是一个购物车变化数据,即:

  • 那么,在实际开发中,我们就会使用变量保存操作这些变化数据

1.2 变量

  • 变量的定义:变量是程序中不可或缺的组成单位,最基本的存储单元。其实,变量就是一个存储数据的临时空间,可以向其中存储不同类型的数据,如:整数、小数、字符、字符串等,并且变量中的数据在程序运行的时候可以动态改变。

NOTE

  • 变量:用来存储数据容器
  • 数据:可以是一个用来计算的数字,如:上文购物车中的价格等;也可以是一句话中的关键词其它任意格式的数据
  • 变量的特别之处就在于它存放的数据是可以改变的。
  • 我们可以将变量想象为一个容器,盒子中装的就是我们想要的数据,并且我们需要盒子一个特别的名称;通过这个特别的名称,我们可以盒子添加数据移除数据,这个特别的名称就是变量名

NOTE

  • 变量是内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化
  • ② 通过变量名,可以操作这块内存区域,向其中存储数据获取数据以及移除数据
  • ③ 变量的构成包含三个要素:数据类型变量名需要存储的数据
  • ④ 在生活中,我们会经常说:这件衣服的价格是 100(整型) 元,这双鞋子的价格是 250.5(小数,浮点类型) 元,今天天气真好(字符串类型)之类的话;在计算机科学中,这些都是数据,并且它们是有类型,即:数据类型。(数据类型用于定义变量所能存储的数据的种类以及可以对这些数据进行的操作的一种分类,每种数据类型都有特定的属性和用途,它们决定了变量在内存中如何表示和存储,以及变量可以执行哪些操作)

1.3 变量的声明和使用

  • ① 变量必须先声明,后使用。
  • ② 可以先声明变量再赋值,也可以在声明变量的同时进行赋值。
  • ③ 变量的值可以在同一类型范围内不断变化。

IMPORTANT

在实际开发中,我们通常都会在声明变量的同时,给其赋值,这被称为初始化。

  • 示例:先声明,再使用
c
#include <stdio.h>
 
 int main() {
 
@@ -256,7 +256,7 @@
 
     return 0;
 }

3.3 进制的转换

3.3.1 概述

  • 不同进制的转换,如下所示:

  • 在计算机中,数据是从右往左的方式排列的;其中,最右边的是低位,最左边的是高位,即:

3.3.2 二进制和十进制的转换

3.3.2.1 二进制转换为十进制

  • 规则:从最低位开始,将每个位上的数提取出来,乘以 2 的 (位数 - 1 )次方,然后求和。

NOTE

  • ① 在学术界,将这种计算规则,称为位权相加法
  • 八进制转换为十进制十六进制转换为十进制二进制转换为十进制的算法相同!!!
  • 示例:十进制转十进制

  • 示例:二进制转十进制

3.3.2.2 十进制转换二进制

  • 规则:将该数不断除以 2 ,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。

NOTE

  • ① 在学术界,将这种计算规则,称为短除法连续除2取余法
  • ② 很好理解,只有不断地除以 2 ,就能保证最大的数字不超过 2 ,这不就是二进制(只能有 0 或 1)吗?
  • 八进制转换为二进制十六进制转换为二进制十进制转换为二进制的算法相同!!!
  • 示例:十进制转十进制

  • 示例:十进制转二进制

3.3.3 二进制转八进制

  • 规则:每 3 位二进制就是一个八进制。

  • 示例:011 101 001 -> 351

3.3.4 二进制转十六进制

  • 规则:每 4 位二进制就是一个十六进制。

  • 示例:1110 1001 -> 0xE9

3.4 原码、反码和补码

3.4.1 概述

  • 机器数:一个数在计算机的存储形式是二进制,我们称这些二进制数为机器数。机器数可以是有符号的,用机器数的最高位来存放符号位,0 表示正数,1 表示负数。

  • 真值:因为机器数带有符号位,所以机器数的形式值不等于其真实表示的值(真值),以机器数 1000 0001 为例,其真正表示的值(首位是符号位)为 -1,而形式值却是 129 ,因此将带有符号位的机器数的真正表示的值称为机器数的真值。

3.4.2 原码

  • 原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值。
  • 规则:
    • 正数的原码是它本身对应的二进制数,符号位是 0 。
    • 负数的原码是它本身绝对值对应的二进制数,但是符号位是 1 。
  • +1 的原码,使用 8 位二进数来表示,就是:
十进制数原码(8位二进制数)
+10000 0001
  • -1 的原码,使用 8 位二进数来表示,就是:
十进制数原码(8位二进制数)
-11000 0001

IMPORTANT

按照原码的规则,会出现 +0-0 的情况,即:0000 0000(+0)、1000 0000(-0),显然不符合实际情况;所以,计算机底层虽然存储和计算的都是二进数,但显然不是原码。

3.4.3 反码

  • 规则:

    • 正数的反码和它的原码相同。
    • 负数的反码是在其原码的基础上,符号位不变,其余各位取反。
  • +1 的反码,使用 8 位二进数来表示,就是:

十进制数原码(8位二进制数)反码(8位二进制数)
+10000 00010000 0001
  • -1 的反码,使用 8 位二进数来表示,就是:
十进制数原码(8位二进制数)反码(8位二进制数)
-11000 00011111 1110

IMPORTANT

按照反码的规则,如果是 +0,对应的原码是 0000 0000;那么,其反码还是 0000 0000 ;如果是 -0,对应的原码是 1000 0000,其反码是 1111 1111,显然不符合实际情况;所以,计算机底层虽然存储和计算的都是二进数,但显然不是反码。

3.4.4 补码

  • 规则:

    • 正数的补码和它的原码相同。
    • 负数的补码是在其反码的基础上 + 1 。
  • +1 的补码,使用 8 位二进数来表示,就是:

十进制数原码(8位二进制数)反码(8位二进制数)补码(8位二进制数)
+10000 00010000 00010000 0001
  • -1 的补码,使用 8 位二进数来表示,就是:
十进制数原码(8位二进制数)反码(8位二进制数)补码(8位二进制数)
-11000 00011111 11101111 1111
  • 如果 0 ,按照 +0 的情况进行处理,即:

  • 如果 0 ,按照 -0 的情况进行处理,即:

IMPORTANT

  • ① 补码表示法解决了原码反码存在的两种零(+0-0)的问题,即:在补码表示法中,只有一个零,即 0000 0000。
  • ②补码使得加法运算减法运算可以统一处理,通过将减法运算转换为加法运算,可以简化硬件设计,提高了运算效率。
  • ③ 计算机底层存储计算的都是二进数的补码

3.4.5 总结

  • ① 正数的原码、反码和补码都是一样的,三码合一。
  • ② 负数的反码是在其原码的基础上,按位取反(0 变 1 ,1 变 0 ),符号位不变;负数的补码是其反码 + 1 。
  • ③ 0 的补码是 0 。

3.5 计算机底层为什么使用补码?

  • 如果计算是 2 - 2 ,那么可以转换为 2 + (-2),这样计算机内部在处理减法计算的时候,就会将其转换为加法计算的形式,以简化硬件设计和提高计算效率。
  • 最高位表示符号位,由于符号位的存在,如果使用原码来计算,就会导致计算结果不正确,即:

  • 补码的设计可以巧妙的让符号位也参与计算,并且可以得到正确的计算结果,即:

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/01_c-basic/03_xdx/index.html b/notes/01_c-basic/03_xdx/index.html index 9564175..d0d7c8e 100644 --- a/notes/01_c-basic/03_xdx/index.html +++ b/notes/01_c-basic/03_xdx/index.html @@ -20,7 +20,7 @@ -
Skip to content

第一章:数据类型(⭐)

1.1 概述

  • 根据变量存储不同,我们可以将变量分为两类:

    • 普通变量:变量所对应的内存中存储的是普通值
    • 指针变量:变量所对应的内存中存储的是另一个变量的地址
  • 如下图所示:

NOTE

普通变量和指针变量的相同点:

  • 普通变量有内存空间,指针变量也有内存空间。
  • 普通变量有内存地址,指针变量也有内存地址。
  • 普通变量所对应的内存空间中有值,指针变量所对应的内存空间中也有值。

普通变量和指针变量的不同点:

  • 普通变量所对应的内存空间存储的是普通的值,如:整数、小数、字符等;指针变量所对应的内存空间存储的是另外一个变量的地址。
  • 普通变量有普通变量的运算方式,而指针变量有指针变量的运算方式(后续讲解)。
  • 那么,在 C 语言中变量的数据类型就可以这么划分,如下所示:

NOTE

  • 根据普通变量存储的类型不同,可以将普通变量类型划分为基本数据类型(整型、字符类型、浮点类型、布尔类型)和复合数据类型(数组类型、结构体类型、共用体类型、枚举类型)。
  • 根据指针变量指向空间存储的类型不同,可以将指针类型分为基本数据类型指针复合数据类型指针函数指针数组指针等,例如:如果指针所指向的空间保存的是 int 类型,那么该指针就是 int 类型的指针。

1.2 整数类型

1.2.1 概述

  • 整数类型简称整型,用于存储整数值,如:12、20、50 等。
  • 根据所占内存空间大小的不同,可以将整数类型划分为:
  • ① 短整型:
类型存储空间(内存空间)取值范围
unsigned short (无符号短整型)2 字节0 ~ 65,535 (2^16 - 1)
[signed] short(有符号短整型,默认)2 字节-32,768 (- 2^15) ~ 32,767 (2^15 -1)
  • ② 整型:
类型存储空间(内存空间)取值范围
unsigned int(无符号整型)4 字节(通常)0 ~ 4294967295 (0 ~2^32 -1)
[signed] int(有符号整型,默认)4 字节(通常)-2147483648(- 2^31) ~ 2147483647 (2^31-1)
  • ③ 长整型:
类型存储空间(内存空间)取值范围
unsigned long(无符号长整型)4 字节(通常)0 ~2^32 -1
[signed] long(有符号长整型,默认)4 字节(通常)- 2^31 ~ 2^31-1
  • ④ 长长整型:
类型存储空间(内存空间)取值范围
unsigned long long(无符号长整型)8 字节(通常)0 ~2^64 -1
[signed] long long(有符号长整型,默认)8 字节(通常)- 2^63 ~ 2^63-1

NOTE

  • ① C 语言默认没有规定各种数据类型所占存储单元的长度,但是通常需要遵守:sizeof(short int) ≤ sizeof(int) ≤ sizeof(long int) ≤ sizeof(long long) ,具体的存储空间由编译系统自行决定;其中,sizeof 是测量类型或变量、常量长度的运算符。
  • ② short 至少 2 个字节,long 至少 4 个字节。
  • ③ 之所以这么规定,是为了可以让 C 语言长久使用,因为目前主流的 CPU 都是 64 位,但是在 C语言刚刚出现的时候,CPU 还是以 8 位和 16 位为主。如果当时就将整型定死为 8 位或 16 位,那么现在我们肯定不会再学习 C 语言了。
  • ④ 整型分为有符号 signed 和无符号 unsigned 两种,默认是 signed。
  • ⑤ 在实际开发中,最常用的整数类型就是 int 类型了,如果取值范围不够,就使用 long 或 long long 。
  • ⑥ C 语言中的格式占位符非常多,只需要大致了解即可;因为,我们在实际开发中,一般都会使用 C++ 或 Rust 以及其它的高级编程语言,如:Java 等,早已经解决了需要通过格式占位符来输入和输出变量。

1.2.2 短整型(了解)

  • 语法:
c
unsigned short x = 10 ; // 无符号短整型
c
short x = -10; // 有符号短整型

NOTE

  • ① 有符号表示的是正数、负数和 0 ,即有正负号。无符号表示的是 0 和正数,即正整数,没有符号。
  • ② 在 printf无符号短整型(unsigned short)格式占位符%hu有符号短整型(signed short)格式占位符%hd
  • ③ 可以通过 sizeof 运算符获取无符号短整型(unsigned short)有符号短整型(signed short)存储空间(所占内存空间)
  • ③ 可以通过 #include <limits.h> 来获取 无符号短整型(unsigned short)有符号短整型(signed short)取值范围
  • 示例:定义和打印短整型变量
c
#include <stdio.h>
+    
Skip to content

第一章:数据类型(⭐)

1.1 概述

  • 根据变量存储不同,我们可以将变量分为两类:

    • 普通变量:变量所对应的内存中存储的是普通值
    • 指针变量:变量所对应的内存中存储的是另一个变量的地址
  • 如下图所示:

NOTE

普通变量和指针变量的相同点:

  • 普通变量有内存空间,指针变量也有内存空间。
  • 普通变量有内存地址,指针变量也有内存地址。
  • 普通变量所对应的内存空间中有值,指针变量所对应的内存空间中也有值。

普通变量和指针变量的不同点:

  • 普通变量所对应的内存空间存储的是普通的值,如:整数、小数、字符等;指针变量所对应的内存空间存储的是另外一个变量的地址。
  • 普通变量有普通变量的运算方式,而指针变量有指针变量的运算方式(后续讲解)。
  • 那么,在 C 语言中变量的数据类型就可以这么划分,如下所示:

NOTE

  • 根据普通变量存储的类型不同,可以将普通变量类型划分为基本数据类型(整型、字符类型、浮点类型、布尔类型)和复合数据类型(数组类型、结构体类型、共用体类型、枚举类型)。
  • 根据指针变量指向空间存储的类型不同,可以将指针类型分为基本数据类型指针复合数据类型指针函数指针数组指针等,例如:如果指针所指向的空间保存的是 int 类型,那么该指针就是 int 类型的指针。

1.2 整数类型

1.2.1 概述

  • 整数类型简称整型,用于存储整数值,如:12、20、50 等。
  • 根据所占内存空间大小的不同,可以将整数类型划分为:
  • ① 短整型:
类型存储空间(内存空间)取值范围
unsigned short (无符号短整型)2 字节0 ~ 65,535 (2^16 - 1)
[signed] short(有符号短整型,默认)2 字节-32,768 (- 2^15) ~ 32,767 (2^15 -1)
  • ② 整型:
类型存储空间(内存空间)取值范围
unsigned int(无符号整型)4 字节(通常)0 ~ 4294967295 (0 ~2^32 -1)
[signed] int(有符号整型,默认)4 字节(通常)-2147483648(- 2^31) ~ 2147483647 (2^31-1)
  • ③ 长整型:
类型存储空间(内存空间)取值范围
unsigned long(无符号长整型)4 字节(通常)0 ~2^32 -1
[signed] long(有符号长整型,默认)4 字节(通常)- 2^31 ~ 2^31-1
  • ④ 长长整型:
类型存储空间(内存空间)取值范围
unsigned long long(无符号长整型)8 字节(通常)0 ~2^64 -1
[signed] long long(有符号长整型,默认)8 字节(通常)- 2^63 ~ 2^63-1

NOTE

  • ① C 语言默认没有规定各种数据类型所占存储单元的长度,但是通常需要遵守:sizeof(short int) ≤ sizeof(int) ≤ sizeof(long int) ≤ sizeof(long long) ,具体的存储空间由编译系统自行决定;其中,sizeof 是测量类型或变量、常量长度的运算符。
  • ② short 至少 2 个字节,long 至少 4 个字节。
  • ③ 之所以这么规定,是为了可以让 C 语言长久使用,因为目前主流的 CPU 都是 64 位,但是在 C语言刚刚出现的时候,CPU 还是以 8 位和 16 位为主。如果当时就将整型定死为 8 位或 16 位,那么现在我们肯定不会再学习 C 语言了。
  • ④ 整型分为有符号 signed 和无符号 unsigned 两种,默认是 signed。
  • ⑤ 在实际开发中,最常用的整数类型就是 int 类型了,如果取值范围不够,就使用 long 或 long long 。
  • ⑥ C 语言中的格式占位符非常多,只需要大致了解即可;因为,我们在实际开发中,一般都会使用 C++ 或 Rust 以及其它的高级编程语言,如:Java 等,早已经解决了需要通过格式占位符来输入和输出变量。

1.2.2 短整型(了解)

  • 语法:
c
unsigned short x = 10 ; // 无符号短整型
c
short x = -10; // 有符号短整型

NOTE

  • ① 有符号表示的是正数、负数和 0 ,即有正负号。无符号表示的是 0 和正数,即正整数,没有符号。
  • ② 在 printf无符号短整型(unsigned short)格式占位符%hu有符号短整型(signed short)格式占位符%hd
  • ③ 可以通过 sizeof 运算符获取无符号短整型(unsigned short)有符号短整型(signed short)存储空间(所占内存空间)
  • ③ 可以通过 #include <limits.h> 来获取 无符号短整型(unsigned short)有符号短整型(signed short)取值范围
  • 示例:定义和打印短整型变量
c
#include <stdio.h>
 
 int main() {
 
@@ -789,7 +789,7 @@
 
     return 0;
 }

2.8 运算符优先级

  • C 语言中运算符的优先级,如下所示:
优先级运算符名称或含义结合方向
1[]数组下标左到右
()圆括号
.成员选择(对象)
->成员选择(指针)
2-负号运算符右到左
(类型)强制类型转换
++自增运算符
--自减运算符
*取值运算符
&取地址运算符
!逻辑非运算符
~按位取反运算符
sizeof长度运算符
3/左到右
*
%余数(取模)
4+左到右
-
5<<左移左到右
>>右移
6>大于左到右
>=大于等于
<小于
<=小于等于
7==等于左到右
!=不等于
8&按位与左到右
9^按位异或左到右
10|按位或左到右
11&&逻辑与左到右
12||逻辑或左到右
13?:条件运算符右到左
14=赋值运算符右到左
/=除后赋值
*=乘后赋值
%=取模后赋值
+=加后赋值
-=减后赋值
<<=左移后赋值
>>=右移后赋值
&=按位与后赋值
^=按位异或后赋值
|=按位或后赋值
15,逗号运算符左到右

WARNING

  • ① 不要过多的依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用小括号来控制表达式的执行顺序。
  • ② 不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。
  • ③ 运算符优先级不用刻意地去记忆,总体上:一元运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符。

第三章:附录

3.1 字符集和字符集编码

3.3.1 概述

  • 字符集和字符集编码(简称编码)计算机系统中处理文本数据的两个基本概念,它们密切相关但又有区别。
  • 字符集(Character Set)是一组字符的集合,其中每个字符都被分配了一个唯一的编号(通常是数字)。字符可以是字母、数字、符号、控制代码(如换行符)等。字符集定义了可以表示的字符的范围,但它并不直接定义如何将这些字符存储在计算机中。

NOTE

ASCII(美国信息交换标准代码)是最早期和最简单的字符集之一,它只包括了英文字母、数字和一些特殊字符,共 128 个字符。每个字符都分配给了一个从 0 到 127 的数字。

  • 字符集编码(Character Encoding,简称编码)是一种方案或方法,它定义了如何将字符集中的字符转换为计算机存储和传输的数据(通常是一串二进制数字)。简而言之,编码是字符到二进制数据之间的映射规则。

NOTE

ASCII编码方案定义了如何将 ASCII 字符集中的每个字符表示为 7 位的二进制数字。例如:大写字母"A"在ASCII 编码中表示为二进制的1000001,十进制的 65

  • 字符集字符集编码之间的关系如下:

  • Linux 中安装帮助手册:

3.3.2 ASCII 编码

  • 冯·诺依曼体系结构中,我们知道,计算机中所有的数据指令都是以二进制的形式表示的;所以,计算机中对于文本数据的数据也是以二进制来存储的,那么对应的流程如下:

  • 我们知道,计算机是上个世纪 60 年代在美国研制成功的,为了实现字符和二进制的转换,美国就制定了一套字符编码,即英语字符和二进制位之间的关系,即 ASCII (American Standard Code for Information Interchange)编码:
    • ASCII 编码只包括了英文字符、数字和一些特殊字符,一共 128 个字符,并且每个字符都分配了唯一的数字,范围是 0 - 127。
    • ASCII 编码中的每个字符都使用 7 位的二进制数字表示;但是,计算机中的存储的最小单位是 1 B = 8 位,那么最高位统一规定为 0 。

NOTE

  • ① 其实,早期是没有字符集的概念的,只是后来为了解决乱码问题,而产生了字符集的概念。
  • ② 对于英文体系来说,a-zA-Z0-9以及一些特殊字符一共 128 就可以满足实际存储需求;所以,在也是为什么 ASCII 码使用 7 位二进制(2^7 = 128 )来存储的。
  • 在操作系统中,就内置了对应的编码表,Linux 也不例外;可以使用如下的命令查看:
shell
man ascii

  • 其对应的 ASCII 编码表,如下所示:

  • 但是,随着计算机的发展,计算机开始了东征之路,由美国传播到东方:

  • 先是传播到了欧洲,欧洲在兼容 ASCII 编码的基础上,推出了 ISO8859-1 编码,即:
    • ISO8859-1 编码包括基本的拉丁字母表、数字、标点符号,以及西欧语言中特有的一些字符,如:法语中的 è、德语中的 ü 等。
    • ISO 8859-1 为每个字符分配一个单字节(8 位)编码,意味着它可以表示最多 256 (2^8)个不同的字符(编号从 0 到 255)。
    • ISO 8859-1 的前 128 个字符与 ASCII 编码完全一致,这使得 ASCII 编码的文本可以无缝转换为 ISO 8859-1 编码。

  • 计算机继续传播到了亚洲,亚洲(双字节)各个国家分别给出了自己国家对应的字符集编码,如:
    • 日本推出了 Shift-JIS 编码:
      • 单字节 ASCII 范围:0 - 127。
      • 双字节范围:
        • 第一个字节:129 - 159 和 224 - 239 。
        • 第二个字节:64 - 126 和 128 - 252 。
    • 韩国推出了 EUC-KR 编码:
      • 单字节 ASCII 范围:0 - 127。
      • 双字节范围:从 41281 - 65278。
    • 中国推出了 GBK 编码:
      • 单字节 ASCII 范围:0 - 127。
      • 双字节范围:33088 - 65278 。

NOTE

  • ① 通过上面日本、韩国、中国的编码十进制范围,我们可以看到,虽然这些编码系统在技术上的编码范围存在重叠(特别是在高位字节区域),但因为它们各自支持的字符集完全不同,所以实际上它们并不直接冲突。
  • ② 但是,如果一个中国人通过 GBK 编码写的文章,通过邮件发送给韩国人,因为韩国和中国在字符集编码上的高位字节有重叠部分,必然会造成歧义。

3.3.3 Unicode 编码

  • 在 Unicode 之前,世界上存在着数百种不同的编码系统,每一种编码系统都是为了支持特定语言或一组语言的字符集。这些编码系统,包括:ASCII、ISO 8859 系列、GBK、Shift-JIS、EUC-KR 等,它们各自有不同的字符范围和编码方式。这种多样性虽然在局部范围内解决了字符表示的问题,但也带来了以下几个方面的挑战:

    • 编码冲突:由于不同的编码系统可以为相同的字节值分配不同的字符,因此在不同编码之间转换文本时,如果没有正确处理编码信息,就很容易产生乱码。这种编码冲突在尝试处理多种语言的文本时尤为突出。
    • 编码的复杂性:随着全球化的发展,软件和系统需要支持越来越多的语言,这就要求开发者和系统同时处理多种不同的编码系统。这不仅增加了开发和维护的复杂性,而且也增加了出错的风险。
    • 资源限制:在早期计算机技术中,内存和存储资源相对有限。不同的编码标准要求系统存储多套字符集数据,这无疑增加了对有限资源的消耗。
    • ……
  • 针对上述的种种问题,为了推行全球化,Unicode 应运而生,Unicode 的核心规则和设计原则是建立一个全球统一的字符集,使得世界上所有的文字和符号都能被唯一地识别和使用,无论使用者位于何地或使用何种语言。这套规则包括了字符的编码、表示、处理和转换机制,旨在确保不同系统和软件间能够无缝交换和处理文本数据。

    • 通用字符集 (UCS):Unicode 为每一个字符分配一个唯一的编号(称为“码点”)。这些码点被组织在一个统一的字符集中,官方称之为 “通用字符集”(Universal Character Set,UCS)。码点通常表示为 U+ 后跟一个十六进制数,例如:U+0041 代表大写的英文字母 “A”
    • 编码平面和区段:Unicode 码点被划分为多个 “平面(Planes)”,每个平面包含 65536(16^4)个码点。目前,Unicode定义了 17 个平面(从 0 到16),每个平面被分配了一个编号,从 “基本多文种平面(BMP)” 的 0 开始,到 16 号平面结束。这意味着 Unicode 理论上可以支持超过 110万(17*65536)个码点。
  • Unicode 仅仅只是字符集,给每个字符设置了唯一的数字编号而已,却没有给出这些数字编号实际如何存储,可以通过如下命令查看:

  • 为了在计算机系统中表示 Unicode 字符,定义了几种编码方案,这些方案包括 UTF-8、UTF-16 和 UTF-32 等。
    • UTF-8:使用 1 - 4 个字节表示每个 Unicode 字符,兼容 ASCII,是网络上最常用的编码。
    • UTF-16:使用 2 - 4 个字节表示每个 Unicode 字符,适合于需要经常处理基本多文种平面之外字符的应用。
    • UTF-32:使用固定的 4 个字节表示每个 Unicode 字符,简化了字符处理,但增加了存储空间的需求。
  • Unicode 字符集和对应的UTF-8 字符编码之间的关系,如下所示:

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/01_c-basic/04_xdx/index.html b/notes/01_c-basic/04_xdx/index.html index 6269f64..0f644f3 100644 --- a/notes/01_c-basic/04_xdx/index.html +++ b/notes/01_c-basic/04_xdx/index.html @@ -20,7 +20,7 @@ -
Skip to content

第一章:概述

  • 流程控制结构是用来控制程序中各语句执行顺序的语句,并且可以将语句组合成能完成一定功能小逻辑模块

  • 在程序设计中规定了三种流程结构,如下所示:

    • 顺序结构:程序从上到下逐行执行,中间没有任何判断和跳转。
    • 分支结构:根据条件,有选择的执行某段代码。在 C 语言中,有 if...elseswitch...case 两种分支语句。
    • 循环结构:根据循环条件,重复性的执行某段代码。在 C 语言中,有 forwhiledo...while 三种循环结构。
  • 在生活中的洗衣工厂,就包含了上述的三种流程结构,如下所示:

第二章:顺序结构

2.1 概述

  • 程序从上到下逐行地执行,表达式语句都是顺序执行的,并且上一行对某个变量的修改对下一行会产生影响。

2.2 应用示例

  • 示例:
c
#include <stdio.h>
+    
Skip to content

第一章:概述

  • 流程控制结构是用来控制程序中各语句执行顺序的语句,并且可以将语句组合成能完成一定功能小逻辑模块

  • 在程序设计中规定了三种流程结构,如下所示:

    • 顺序结构:程序从上到下逐行执行,中间没有任何判断和跳转。
    • 分支结构:根据条件,有选择的执行某段代码。在 C 语言中,有 if...elseswitch...case 两种分支语句。
    • 循环结构:根据循环条件,重复性的执行某段代码。在 C 语言中,有 forwhiledo...while 三种循环结构。
  • 在生活中的洗衣工厂,就包含了上述的三种流程结构,如下所示:

第二章:顺序结构

2.1 概述

  • 程序从上到下逐行地执行,表达式语句都是顺序执行的,并且上一行对某个变量的修改对下一行会产生影响。

2.2 应用示例

  • 示例:
c
#include <stdio.h>
 
 int main() {
 
@@ -717,7 +717,7 @@
 
     return 0;
 }

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/01_c-basic/05_xdx/index.html b/notes/01_c-basic/05_xdx/index.html index 1e89114..e956849 100644 --- a/notes/01_c-basic/05_xdx/index.html +++ b/notes/01_c-basic/05_xdx/index.html @@ -20,7 +20,7 @@ -
Skip to content

第一章:数组的概念

1.1 为什么需要数组?

1.1.1 需求分析 1

  • 需要统计某公司 50 个员工的工资情况,例如:计算平均工资、最高工资等。如果使用之前的知识,我们需要声明 50 个变量来分别记录每位员工的工资,即:
c
#include <stdio.h>
+    
Skip to content

第一章:数组的概念

1.1 为什么需要数组?

1.1.1 需求分析 1

  • 需要统计某公司 50 个员工的工资情况,例如:计算平均工资、最高工资等。如果使用之前的知识,我们需要声明 50 个变量来分别记录每位员工的工资,即:
c
#include <stdio.h>
 
 int main(){
     
@@ -630,7 +630,7 @@
 
     return 0;
 }

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/index.html b/notes/index.html index b65cf42..30a5b55 100644 --- a/notes/index.html +++ b/notes/index.html @@ -20,8 +20,8 @@ -
Skip to content

c/c++ 学科


Released under the MIT License.

- +
Skip to content

c/c++ 学科


Released under the MIT License.

+ \ No newline at end of file