第1课数据结构_数据基本类型_编码
热度🔥:61 免费课程
授课语音
数据类型和编码
1. 介绍
数据结构和数据有密切的关系,因为数据结构是围绕数据而存在的。在学习数据结构之前,我们需要先了解数据的性质、类型和存储方式。只有了解了数据,我们才能更好地设计和选择适合的数据结构来处理它们。
1.1 定义
- 数据:数据是我们要存储、操作和传输的信息,是计算机处理的基本元素。它可以是数字、文本、图像、音视频等。
- 数据结构:数据结构是一种组织和存储数据的方式。它定义了数据之间的关系,以及如何访问和操作这些数据,是计算机科学的基础,能够帮助我们有效地管理数据。
1.2 基本数据类型
基本数据类型是编程语言中用于存储基本信息的类型。不同的编程语言可能会有不同的基本数据类型,但通常包括以下几种:
1.2.1 整型(Integer)
整型用于表示没有小数部分的数字。在计算机中,整型通常有多种表示方式,主要包括(byte
、short
、int
、long
)。
- 有符号整型:可以表示正数、负数和零。例如,
int
类型在许多编程语言中表示带符号的整型。 - 无符号整型:只表示非负整数,例如,
unsigned int
表示无符号整型。 - 长整型(Long):用于表示比标准整型更大的整数。具体实现可能因编程语言而异。
1.2.2 浮点型(Floating-Point)
浮点型用于表示有小数部分的数值。它包括:
- 单精度浮点型(
float
):占用较少的内存,精度较低。 - 双精度浮点型(
double
):占用更多的内存,精度更高。 浮点数在计算机中的表示方式符合 IEEE 754 标准。
1.2.3 字符型(Character)
字符型用于表示单个字符。它通常使用一个字节或两个字节(在 Unicode 中)来存储。例如,char
类型用于存储单个字符(如 'A'、'1'、'%')。
1.2.4 布尔型(Boolean)
布尔型用于表示逻辑值,通常只有两个可能的值:true
(真)和 false
(假)。它用于逻辑运算和条件判断。
1.2.5 枚举型(Enumeration)
枚举型用于表示一组相关的常量。每个常量有一个名字和一个值。枚举型在编程语言中用于定义有限的离散值集合。例如,表示颜色的枚举型可能包括 RED
、GREEN
和 BLUE
。
2. 数字编码
数字编码是将数字值表示为计算机可以处理的二进制格式的过程。主要的数字编码方法包括:
2.1 二进制编码
二进制编码是最基本的数字编码方式。在二进制系统中,数字只使用 0 和 1 来表示。例如,十进制数 5 在二进制系统中表示为 101
。
2.2 原码和反码
- 原码:直接使用二进制表示数值的绝对值,符号位为 0 表示正数,符号位为 1 表示负数。例如,-5 的原码表示为
10000101
。 - 反码:正数时,原码=反码;负数时,符号位不变,源码取反为反码。例如,-5 的反码是
11111010
。
2.3 补码表示法(Two's Complement)
补码是一种用于表示有符号整数的编码方法,简化了整数的加减法运算。具体规则如下:
- 正数时,原码=反码=补码。
- 负数时,反码=符号位不变,其他位原码取反;补码=反码+1。
补码的优势包括:
- 统一了零的表示:补码中,正零和负零都用相同的编码表示。
- 简化了加法和减法运算:减法运算转化为加法运算。
- 避免了溢出问题:补码的范围是对称的。
- 支持二进制的符号位:补码使用最高位作为符号位。
2.4 格雷码(Gray Code)
格雷码是一种特殊的二进制编码,其中相邻的数字只有一位不同,主要用于减少在数字变化时的误差。
3. 字符编码
字符编码是将字符映射到数字的过程,以便计算机可以存储和处理字符。主要的字符编码方案包括:
3.1 ASCII(American Standard Code for Information Interchange)
ASCII 是最早的字符编码方案之一,用于表示英文字符及一些控制字符。它使用 7 位来表示字符(共 128 个字符),包括大小写字母、数字、标点符号和一些控制字符。
3.2 Unicode
Unicode 是一个国际标准,旨在为世界上所有的字符和符号提供唯一的编码。Unicode 编码方式主要包括:
- UTF-8:可变长度的编码方案,兼容 ASCII,使用 1 到 4 个字节来表示一个字符。
- UTF-16:使用 2 或 4 个字节来表示一个字符。
- UTF-32:使用 4 个字节来表示一个字符。
3.3 EBCDIC(Extended Binary Coded Decimal Interchange Code)
EBCDIC 是 IBM 开发的一种字符编码方案,主要用于大型机和一些老式计算机系统。它与 ASCII 不兼容。
3.4 ISO-8859 系列
ISO-8859 系列是国际标准化组织制定的一组字符编码标准,用于支持不同的语言和地区。
4. 代码案例
C++ 版本代码
#include <iostream>
#include <bitset>
#include <string>
#include <iomanip>
#include <sstream>
using namespace std;
// 枚举类型:交通信号灯
enum TrafficLight {
Red = 1,
Yellow = 2,
Green = 3
};
// 原码和反码计算
void toOriginalAndComplement(int value, int bits) {
string originalCode;
string complementCode;
if (value < 0) {
string original = bitset<8>(-value).to_string().substr(1); // 计算原码
complementCode = original; // 计算反码
for (char& c : complementCode) {
c = (c == '0') ? '1' : '0'; // 反转位
}
originalCode = "Original code: 1" + original;
} else {
originalCode = "Original code: 0" + bitset<8>(value).to_string().substr(1);
}
cout << originalCode << endl;
if (!complementCode.empty()) {
cout << "Complement code: " << complementCode << endl;
}
}
// 补码表示法
string toTwosComplement(int value, int bits) {
if (value < 0) {
value = (1 << bits) + value; // 计算补码
}
bitset<8> b(value);
return b.to_string();
}
// 格雷码转换
string binaryToGray(const string& binary) {
string gray = binary.substr(0, 1); // 格雷码的首位与二进制码的首位相同
for (size_t i = 1; i < binary.size(); i++) {
gray += (binary[i - 1] == binary[i]) ? '0' : '1'; // 计算格雷码的每一位
}
return gray;
}
int main() {
// 1. 基本数据类型示例
// 整型(Integer)
// 示例:计算学生的总成绩
int mathScore = 85; // 数学成绩
int scienceScore = 92; // 科学成绩
int totalScore = mathScore + scienceScore; // 计算总成绩
cout << "Total score is: " << totalScore << endl; // 输出总成绩
// 预期输出: Total score is: 177
// 浮点型(Floating-Point)
// 示例:计算圆的面积
double radius = 5.5; // 圆的半径(浮点数)
double area = 3.14159265359 * radius * radius; // 计算圆的面积
cout << "The area of the circle is: " << fixed << setprecision(2) << area << endl; // 输出圆的面积,保留两位小数
// 预期输出: The area of the circle is: 95.03
// 字符型(Character)
// 示例:显示用户密码的第一个字符
char firstCharacter = 'A'; // 存储密码的第一个字符
char secondCharacter = 'b'; // 存储密码的第二个字符
cout << "Password starts with: " << firstCharacter << secondCharacter << endl; // 输出密码的开始部分
// 预期输出: Password starts with: Ab
// 布尔型(Boolean)
// 示例:登录状态
string username = "user";
string password = "pass";
bool isLoggedIn = (username == "user" && password == "pass"); // 登录验证
cout << "Login status: " << boolalpha << isLoggedIn << endl; // 输出登录状态
// 预期输出: Login status: true
// 枚举型(Enumeration)
// 示例:交通信号灯状态
TrafficLight currentLight = Red; // 当前信号灯状态
if (currentLight == Red) {
cout << "Stop" << endl;
} else if (currentLight == Yellow) {
cout << "Caution" << endl;
} else if (currentLight == Green) {
cout << "Go" << endl;
}
// 预期输出: Stop
// 2. 数字编码示例
// 二进制编码
// 示例:将十进制数 12 转换为二进制
int decimalNumber = 12; // 十进制数
cout << "The binary representation of " << decimalNumber << " is " << bitset<8>(decimalNumber) << endl; // 输出二进制表示
// 预期输出: The binary representation of 12 is 00001100
// 原码和反码
// 示例:表示 -5 的原码和反码
toOriginalAndComplement(-5, 8); // 获取原码和反码
// 补码表示法(Two's Complement)
// 示例:表示 -3 的 8 位补码
cout << "-3 in 8-bit two's complement is " << toTwosComplement(-3, 8) << endl; // 输出补码表示
// 预期输出: -3 in 8-bit two's complement is 11111101
// 格雷码(Gray Code)
// 示例:将二进制数 3 转换为格雷码
string binaryNumber = "0011"; // 二进制数
string grayCode = binaryToGray(binaryNumber); // 转换为格雷码
cout << "Gray code of " << binaryNumber << " is " << grayCode << endl; // 输出格雷码
// 预期输出: Gray code of 0011 is 0010
// 3. 字符编码示例
// ASCII(American Standard Code for Information Interchange)
// 示例:将字符 'A' 转换为 ASCII 码
char asciiChar = 'A';
int asciiCode = static_cast<int>(asciiChar); // 获取字符的 ASCII 码
cout << "ASCII code for '" << asciiChar << "' is " << asciiCode << endl; // 输出 ASCII 码
// 预期输出: ASCII code for 'A' is 65
// Unicode
// 示例:将汉字 '汉' 转换为 Unicode 码
char unicodeChar = '汉';
int unicodeCode = unicodeChar; // 获取字符的 Unicode 码
cout << "Unicode code for '" << unicodeChar << "' is U+" << hex << uppercase << unicodeCode << endl; // 输出 Unicode 码
// 预期输出: Unicode code for '汉' is U+6C49
// EBCDIC(Extended Binary Coded Decimal Interchange Code)
// 示例:假设字符 'A' 在某 EBCDIC 编码页中的码值为 0xC1
int ebcdicCode = 0xC1; // 假设 'A' 在 EBCDIC 编码页中的值
cout << "EBCDIC code for 'A' is " << hex << "0x" << ebcdicCode << endl; // 输出 EBCDIC 码
// 预期输出: EBCDIC code for 'A' is 0xC1
// ISO-8859 系列
// 示例:将字符 'é' 转换为 ISO-8859-1 编码
string isoChar = "é";
stringstream ss;
ss << "ISO-8859-1 encoding of '" << isoChar << "' is ";
for (size_t i = 0; i < isoChar.size(); i++) {
ss << "\\x" << hex << setw(2) << setfill('0') << (int)(unsigned char)isoChar[i];
}
cout << ss.str() << endl; // 输出 ISO-8859-1 编码
// 预期输出: ISO-8859-1 encoding of 'é' is \xe9
return 0;
}
C++ 代码说明:
基本数据类型示例:
- 整型:使用
int
类型计算学生的总成绩。 - 浮点型:使用
double
类型计算圆的面积,使用fixed
和setprecision
设置输出格式。 - 字符型:使用
char
类型处理字符数据。 - 布尔型:使用
bool
类型来判断登录状态,使用boolalpha
设置布尔输出格式。 - 枚举型:使用
enum
类型模拟交通信号灯,并输出相应指令。
- 整型:使用
数字编码示例:
- 二进制编码:使用
bitset
将十进制数转换为二进制。 - 原码和反码:通过自定义的
toOriginalAndComplement
函数计算原码和反码。 - 补码表示法:通过
toTwosComplement
函数计算补码。 - 格雷码:通过自定义的
binaryToGray
函数计算格雷码。
- 二进制编码:使用
字符编码示例:
- ASCII:使用
static_cast<int>
获取字符的 ASCII 码。 - Unicode:直接使用
char
获取 Unicode 码。 - EBCDIC:假设字符 'A' 的 EBCDIC 编码为
0xC1
。 - ISO-8859-1:使用
stringstream
将字符编码转换为 ISO-8859-1 并输出。
- ASCII:使用
预期输出:
Total score is: 177
The area of the circle is: 95.03
Password starts with: Ab
Login status: true
Stop
The binary representation of 12 is 00001100
Original code: 10000101
Complement code: 11111010
-3 in 8-bit two's complement is 11111101
Gray code of 0011 is 0010
ASCII code for 'A' is 65
Unicode code for '汉' is U+6C49
EBCDIC code for 'A' is 0xC1
ISO-8859-1 encoding of 'é' is \xe9
上述代码案例涵盖了基本数据类型、数字编码和字符编码的实际应用,包含详细的中文注释,便于理解和学习。