文章目录
- 💯前言
- 💯C++ 中的数据类型的存储长度
- 1.1 数据类型的存储单位
- 字节与其他存储单位的换算关系
- 1.2 数据类型及其长度
- 1.3 平台对数据类型长度的影响
- 💯数据类型的取值范围
- 2.1 数据类型取值范围表格
- 2.2 `<climits>` 和 `<cfloat>` 的取值范围表格
- `<climits>` 头文件中定义的常量
- `<cfloat>` 头文件中定义的常量
- 2.3 浮点类型的取值范围
- 💯`typedef` 关键字的使用
- 3.1 `typedef` 的基本语法
- 3.2 使用 `typedef` 简化代码
- 3.3 复杂类型的简化
- 3.4 使用 `typedef` 定义结构体别名
- 💯`typedef` 与 `using` 的对比
- 💯实际应用场景
- 💯小结
💯前言
- 在 C++ 编程语言 中,深刻理解数据类型的存储长度、取值范围,以及一些关键的语言特性如
typedef
,是编写高效且可移植代码的基石。本文旨在通过详细讲解这些核心概念,提供深层次的背景知识、理论分析以及实际应用的示例,使读者能够全面掌握这些概念并在实践中灵活应用。
C++ 参考手册
💯C++ 中的数据类型的存储长度
每种数据类型都有其特定的存储长度与取值范围,这些特性决定了变量可以表示的数值大小以及所占用的内存空间。
1.1 数据类型的存储单位
- 比特(bit):最小的存储单位,一个比特可以存储
0
或1
,是所有信息的基本构成单元。 - 字节(byte):基本的存储单位,1 字节等于 8 比特。通常,一个字符(
char
)占用 1 字节,即 8 比特。
字节与其他存储单位的换算关系
在计算机存储结构中,存储容量的单位逐级递增:
- 1 字节(B) = 8 比特(bit)
- 1 千字节(KB) = 1024 字节(B)
- 1 兆字节(MB) = 1024 千字节(KB)
- 1 千兆字节(GB) = 1024 兆字节(MB)
- 1 太字节(TB) = 1024 千兆字节(GB)
- 1 拍字节(PB) = 1024 太字节(TB)
在内存管理中,字节是数据分配的基本单位,而数据类型的长度则决定了其所占用的内存空间。
1.2 数据类型及其长度
数据类型 | 字节数 | 取值范围 | 描述 |
---|---|---|---|
char | 1 | -128 到 127 | 用于存储单个字符 |
bool | 1 | true 或 false | 用于存储布尔值 |
short | 2 | -32768 到 32767 | 用于存储较小范围的整数 |
int | 4 | -2147483648 到 2147483647 | 最常用的整数类型 |
long | 4 或 8 | -2147483648 到 2147483647 或更大 | 在 Windows 通常为 4 字节,在 64 位 Linux 通常为 8 字节 |
long long | 8 | -9223372036854775808 到 9223372036854775807 | 用于存储非常大的整数 |
float | 4 | 约 3.4e-38 到 3.4e+38 | 用于单精度浮点数 |
double | 8 | 约 1.7e-308 到 1.7e+308 | 用于双精度浮点数 |
long double | 16 | 约 3.4e-4932 到 1.1e+4932 | 用于扩展精度的浮点数 |
1.3 平台对数据类型长度的影响
数据类型的长度和取值范围可能因编译器和系统架构(如 32 位或 64 位系统)而有所差异。为了精确地了解数据类型在特定平台上的长度,我们可以使用 sizeof()
运算符,它返回数据类型或变量在内存中占用的字节数。
#include <iostream>
using namespace std;int main() {cout << "Size of char: " << sizeof(char) << " bytes" << endl;cout << "Size of int: " << sizeof(int) << " bytes" << endl;cout << "Size of long: " << sizeof(long) << " bytes" << endl;cout << "Size of long long: " << sizeof(long long) << " bytes" << endl;cout << "Size of float: " << sizeof(float) << " bytes" << endl;cout << "Size of double: " << sizeof(double) << " bytes" << endl;cout << "Size of long double: " << sizeof(long double) << " bytes" << endl;return 0;
}
在不同平台上运行此代码,long
和 long double
的长度可能会有明显差异,这种差异反映了不同硬件和操作系统对数据存储的处理方式。
💯数据类型的取值范围
C++ 提供了 <climits>
头文件,用于定义各整数类型的取值范围宏。以下列出了一些常见的宏:
CHAR_MIN
和CHAR_MAX
:char
类型的最小值和最大值。SHRT_MIN
和SHRT_MAX
:short
类型的最小值和最大值。INT_MIN
和INT_MAX
:int
类型的最小值和最大值。LONG_MIN
和LONG_MAX
:long
类型的最小值和最大值。LLONG_MIN
和LLONG_MAX
:long long
类型的最小值和最大值。
对于无符号类型(例如 unsigned int
),最小值为 0
,而最大值可以通过 UINT_MAX
来获得。
#include <iostream>
#include <climits>
using namespace std;int main() {cout << "char: " << CHAR_MIN << " to " << CHAR_MAX << endl;cout << "unsigned char: 0 to " << UCHAR_MAX << endl;cout << "short: " << SHRT_MIN << " to " << SHRT_MAX << endl;cout << "unsigned short: 0 to " << USHRT_MAX << endl;cout << "int: " << INT_MIN << " to " << INT_MAX << endl;cout << "unsigned int: 0 to " << UINT_MAX << endl;cout << "long: " << LONG_MIN << " to " << LONG_MAX << endl;cout << "unsigned long: 0 to " << ULONG_MAX << endl;cout << "long long: " << LLONG_MIN << " to " << LLONG_MAX << endl;cout << "unsigned long long: 0 to " << ULLONG_MAX << endl;return 0;
}
2.1 数据类型取值范围表格
类型 | 取值范围 | 速记最小值宏 | 速记最大值宏 |
---|---|---|---|
char | -128 ~ 127 | CHAR_MIN | CHAR_MAX |
unsigned char | 0 ~ 255 | 0 | UCHAR_MAX |
short | -32768 ~ 32767 | SHRT_MIN | SHRT_MAX |
unsigned short | 0 ~ 65535 | 0 | USHRT_MAX |
int | -2147483648 ~ 2147483647 | INT_MIN | INT_MAX |
unsigned int | 0 ~ 4294967295 | 0 | UINT_MAX |
long | -2147483648 ~ 2147483647 | LONG_MIN | LONG_MAX |
unsigned long | 0 ~ 4294967295 | 0 | ULONG_MAX |
long long | -9223372036854775808 ~ 9223372036854775807 | LLONG_MIN | LLONG_MAX |
unsigned long long | 0 ~ 18446744073709551615 | 0 | ULLONG_MAX |
2.2 <climits>
和 <cfloat>
的取值范围表格
<climits>
头文件中定义的常量
类型 | 最小值宏 | 最大值宏 | 无符号最大值宏 |
---|---|---|---|
char | CHAR_MIN | CHAR_MAX | UCHAR_MAX |
signed char | SCHAR_MIN | SCHAR_MAX | 无(signed char 没有无符号版本) |
unsigned char | 无 | 无 | UCHAR_MAX |
short | SHRT_MIN | SHRT_MAX | USHRT_MAX |
unsigned short | 无 | 无 | USHRT_MAX |
int | INT_MIN | INT_MAX | UINT_MAX |
unsigned int | 无 | 无 | UINT_MAX |
long | LONG_MIN | LONG_MAX | ULONG_MAX |
unsigned long | 无 | 无 | ULONG_MAX |
long long | LLONG_MIN | LLONG_MAX | ULLONG_MAX |
unsigned long long | 无 | 无 | ULLONG_MAX |
<cfloat>
头文件中定义的常量
类型 | 最小值宏 | 最大值宏 | 精度范围宏 |
---|---|---|---|
float | FLT_MIN | FLT_MAX | FLT_DIG (精度) |
double | DBL_MIN | DBL_MAX | DBL_DIG (精度) |
long double | LDBL_MIN | LDBL_MAX | LDBL_DIG (精度) |
2.3 浮点类型的取值范围
对于浮点类型,C++ 提供了 <cfloat>
头文件,用于定义 float
、double
和 long double
的最小值和最大值。
FLT_MIN
和FLT_MAX
:float
的最小值和最大值。DBL_MIN
和DBL_MAX
:double
的最小值和最大值。LDBL_MIN
和LDBL_MAX
:long double
的最小值和最大值。
💯typedef
关键字的使用
typedef
是 C++ 中一个非常强大的关键字,用于为已有类型定义新的名称,以提高代码的可读性和简洁性。尤其是在定义复杂类型时,typedef
可以大大简化代码,使其更加易于理解和维护。
3.1 typedef
的基本语法
typedef 旧类型名 新类型名;
- 旧类型名:要简化的类型。
- 新类型名:定义的新名称,用于替代旧类型名。
3.2 使用 typedef
简化代码
typedef unsigned int uint; // 定义 uint 为 unsigned int 的别名
typedef long long ll; // 定义 ll 为 long long 的别名
typedef unsigned long long ull; // 定义 ull 为 unsigned long long 的别名int main() {uint num1 = 10; // 等价于 unsigned int num1 = 10;ll num2 = 123456789; // 等价于 long long num2 = 123456789;ull num3 = 987654321; // 等价于 unsigned long long num3 = 987654321;return 0;
}
3.3 复杂类型的简化
对于复杂类型(如函数指针或结构体),typedef
的作用尤为重要。例如,使用 typedef
来定义函数指针类型,可以大幅度提高代码的可读性。
typedef int (*FuncPointer)(int, int); // 定义函数指针类型
int add(int a, int b) {return a + b;
}int main() {FuncPointer fp = add; // 使用 typedef 定义的函数指针int result = fp(10, 20); // 调用函数cout << "Result: " << result << endl;return 0;
}
3.4 使用 typedef
定义结构体别名
在 C++ 中,结构体类型通常也可以用 typedef
来简化。
typedef struct {int x;int y;
} Point; // 定义 Point 为匿名结构体的别名int main() {Point p = {10, 20}; // 使用 typedef 定义的结构体别名cout << "Point: (" << p.x << ", " << p.y << ")" << endl;return 0;
}
💯typedef
与 using
的对比
C++11 引入了 using
关键字,可以替代 typedef
,并且在涉及模板时更为灵活。
using uint = unsigned int; // 等价于 typedef unsigned int uint;
using ll = long long;
using ull = unsigned long long;
using
语法更为直观,特别是在模板编程中,其可读性和灵活性更强。因此,在现代 C++ 中,using
被广泛推荐使用。
💯实际应用场景
- 简化常用类型:例如
typedef unsigned int uint;
,减少代码的冗余,提升可读性。 - 函数指针的定义:为复杂的函数指针定义别名,简化其声明和使用。
- 跨平台支持:使用
typedef
或using
根据不同平台定义不同的数据类型,以提高代码的跨平台适配性。 - 数据结构命名:为结构体或类定义清晰的别名,使代码更加易于理解和维护。
💯小结
数据类型的长度与取值范围:不同的数据类型在不同平台上有不同的长度和取值范围。通过使用sizeof()
、<climits>
和<cfloat>
可以确定各类型的具体信息。typedef
的使用:typedef
可以简化类型名,使代码更具可读性,尤其在复杂类型如函数指针和结构体中非常有用。using
的推荐使用:在现代 C++ 中,using
关键字更加灵活,尤其适用于模板类型的简化。
通过深入理解数据类型、sizeof
、typedef
等概念,可以帮助程序员写出更高效、可读性强且易于维护的代码。这些基础知识对于 C++ 的深入学习和实际编程中的应用至关重要。希望本文的内容能够帮助你更好地掌握 C++ 中的数据类型及其相关概念,从而在编程实践中游刃有余。