青少年编程与数学 02-010 C++程序设计基础 13课题、数据类型
- 一、C++数据类型
- 二、整型
- 1. 基本整型数据类型
- 2. 无符号整型数据类型
- 3. 整型字面量
- 4. 类型别名
- 5. 类型特性
- 示例代码
- 总结
- 三、浮点型
- 1. 基本浮点型数据类型
- 2. 浮点字面量
- 3. 类型特性
- 4. 浮点数的精度和舍入
- 5. 浮点数的比较
- 6. 示例代码
- 总结
- 四、字符型
- 1. 基本字符型数据类型
- 2. 字符字面量
- 3. 转义字符
- 4. 字符串字面量
- 5. 类型特性
- 6. 示例代码
- 总结
- 五、布尔型
- 1. 基本布尔型数据类型
- 2. 布尔字面量
- 3. 布尔型与整型的转换
- 4. 布尔运算
- 5. 布尔型在条件语句中的使用
- 6. 示例代码
- 总结
- 六、空类型
- 1. `void` 作为函数返回类型
- 2. `void` 作为函数参数类型
- 3. `void` 指针
- 4. `void` 表达式
- 5. `void` 在模板编程中的应用
- 6. 示例代码
- 总结
- 七、类型修饰符
- 1. signed 和 unsigned
- 2. short 和 long
- 3. long long
- 4. float 和 double
- 5. long double
- 使用场景
课题摘要: 本文专注于C++的数据类型。C++的数据类型体系是静态的,分为基本内置数据类型(如整型、浮点型、字符型、布尔型和空类型)、构造型(如指针、引用、数组、结构体、共用体和类)、派生类型(如函数类型和指向成员的指针)以及类型修饰符(如signed、unsigned、short、long、const和volatile)。文章还介绍了自定义类型,包括通过
typedef
和enum
创建的新类型名。随着C++标准的发展,引入了新的类型特性,如nullptr
、auto
、decltype
、std::optional
、std::variant
和std::any
。文章详细解析了整型、浮点型、字符型、布尔型和空类型void
的特点、使用方法和示例代码,帮助读者深入理解C++数据类型。
一、C++数据类型
C++的数据类型体系是静态类型的,这意味着变量的类型在编译时就必须确定,并且在程序执行期间不能改变。C++支持多种数据类型,可以大致分为以下几类:
- 基本内置数据类型(Built-in Data Types)
- 整型(int):用于存储整数。
- 浮点型(float, double):用于存储实数,包括小数。
- 字符型(char):用于存储单个字符。
- 布尔型(bool):用于存储逻辑值,true 或 false。
- 空类型(void):表示没有可用的值。
- 构造型(Compound Types)
- 指针(Pointer):存储内存地址。
- 引用(Reference):作为对象的别名。
- 数组(Array):固定大小的、同类型元素的集合。
- 结构体(struct)和共用体(union):用户自定义的多个不同类型数据项的组合。
- 类(class):用户自定义的复杂数据类型,包含数据成员和成员函数。
- 派生类型(Derived Types)
- 函数类型(Function Type):表示函数的签名。
- 指向成员的指针(Pointer to Member):指向类成员的指针。
- 类型修饰符(Type Modifiers)
- signed, unsigned:指定整型或字符型的符号性。
- short, long, long long:修改整型的长度。
- const:定义不可变的变量或指针。
- volatile:指示该变量可能被意想不到地改变,比如硬件中断。
- 自定义类型(User-defined Types)
- 通过
typedef
关键字创建的新类型名。 - 使用
enum
枚举类型来定义一组命名的整数值。
- 通过
C++还提供了一些类型限定符如const
和volatile
,以及类型转换操作符,如static_cast
, dynamic_cast
, reinterpret_cast
, 和 const_cast
等,用于安全地进行类型转换。
此外,随着C++标准的发展,新的类型特性也被引入,例如C++11之后引入了nullptr
用于表示空指针,auto
和decltype
关键字用于自动类型推导等。C++17和C++20进一步增加了诸如std::optional
, std::variant
, 和 std::any
这样的类型,它们提供了更丰富的类型处理能力。
二、整型
C++20中的整型数据类型与之前的版本相比,在类型定义和使用上并没有发生根本性的变化,但C++20标准对一些细节进行了规范和优化,使得整型数据类型的使用更加灵活和安全。以下是C++20中整型数据类型的详细解析:
1. 基本整型数据类型
C++20中的基本整型数据类型包括 short
、int
、long
和 long long
。这些类型的大小和取值范围在不同的编译器和操作系统上可能会有所不同,但C++标准规定了它们的最小大小。
类型 | 最小大小(字节) | 典型大小(字节) | 取值范围 |
---|---|---|---|
short | 2 | 2 | -32,768 到 32,767 |
int | 2 | 4 | -2,147,483,648 到 2,147,483,647 |
long | 4 | 4 (32位系统) / 8 (64位系统) | -2,147,483,648 到 2,147,483,647 (32位系统) -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 (64位系统) |
long long | 8 | 8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
2. 无符号整型数据类型
除了有符号整型数据类型,C++还提供了无符号整型数据类型,这些类型只能表示非负整数。无符号整型数据类型的大小与对应的有符号整型数据类型相同,但取值范围不同。
类型 | 最小大小(字节) | 典型大小(字节) | 取值范围 |
---|---|---|---|
unsigned short | 2 | 2 | 0 到 65,535 |
unsigned int | 2 | 4 | 0 到 4,294,967,295 |
unsigned long | 4 | 4 (32位系统) / 8 (64位系统) | 0 到 4,294,967,295 (32位系统) 0 到 18,446,744,073,709,551,615 (64位系统) |
unsigned long long | 8 | 8 | 0 到 18,446,744,073,709,551,615 |
3. 整型字面量
C++20支持多种整型字面量的表示方式,包括十进制、八进制、十六进制和二进制字面量。自C++14起,二进制字面量也被支持。
字面量类型 | 示例 |
---|---|
十进制 | 42 |
八进制 | 052 |
十六进制 | 0x2a |
二进制 | 0b101010 |
4. 类型别名
C++20通过 <cstdint>
头文件提供了一些固定大小的整型类型别名,这些别名可以确保在不同平台上具有相同的大小和取值范围。
类型别名 | 大小(字节) | 取值范围 |
---|---|---|
int8_t | 1 | -128 到 127 |
uint8_t | 1 | 0 到 255 |
int16_t | 2 | -32,768 到 32,767 |
uint16_t | 2 | 0 到 65,535 |
int32_t | 4 | -2,147,483,648 到 2,147,483,647 |
uint32_t | 4 | 0 到 4,294,967,295 |
int64_t | 8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
uint64_t | 8 | 0 到 18,446,744,073,709,551,615 |
5. 类型特性
C++20通过 <type_traits>
头文件提供了一些类型特性,可以用于在编译时检查和操作整型数据类型。例如,std::is_integral
可以检查一个类型是否为整型,std::make_signed
和 std::make_unsigned
可以将一个整型类型转换为对应的有符号或无符号类型。
示例代码
以下是一个示例代码,展示了如何使用C++20中的整型数据类型和类型特性:
#include <iostream>
#include <type_traits>
#include <cstdint>
int main() {
// 基本整型
short s = 10;
int i = 100;
long l = 1000L;
long long ll = 1000000000000000000LL;
// 无符号整型
unsigned short us = 10;
unsigned int ui = 100;
unsigned long ul = 1000UL;
unsigned long long ull = 1000000000000000000ULL;
// 固定大小的整型
int8_t i8 = -128;
uint8_t u8 = 255;
int16_t i16 = -32768;
uint16_t u16 = 65535;
int32_t i32 = -2147483648;
uint32_t u32 = 4294967295;
int64_t i64 = -9223372036854775808;
uint64_t u64 = 18446744073709551615;
// 类型特性
std::cout << "short is integral: " << std::is_integral<short>::value << std::endl;
std::cout << "unsigned int is unsigned: " << std::is_unsigned<unsigned int>::value << std::endl;
std::cout << "signed int is signed: " << std::is_signed<int>::value << std::endl;
// 类型转换
std::cout << "Signed int32_t: " << std::make_signed<uint32_t>::type(-1) << std::endl;
std::cout << "Unsigned int32_t: " << std::make_unsigned<int32_t>::type(1) << std::endl;
return 0;
}
总结
C++20中的整型数据类型在功能和使用上与之前的版本基本一致,但通过一些新的特性和优化,使得整型数据类型的使用更加灵活和安全。通过 <cstdint>
和 <type_traits>
头文件,开发者可以更方便地使用固定大小的整型类型和进行类型特性检查。
三、浮点型
C++中的浮点型数据类型用于表示小数,它们可以存储分数和实数。浮点型数据类型在科学计算、图形处理、金融计算等领域中非常重要。以下是C++中浮点型数据类型的详细解析:
1. 基本浮点型数据类型
C++提供了三种基本的浮点型数据类型:float
、double
和 long double
。这些类型的大小和精度在不同的编译器和操作系统上可能会有所不同,但C++标准规定了它们的最小精度。
类型 | 典型大小(字节) | 精度(位) | 取值范围 |
---|---|---|---|
float | 4 | 24 | ±1.18e-38 到 ±3.40e+38 |
double | 8 | 53 | ±2.23e-308 到 ±1.79e+308 |
long double | 8 (32位系统) / 16 (64位系统) | 64 (32位系统) / 113 (64位系统) | ±3.36e-4932 到 ±1.19e+4932 (64位系统) |
2. 浮点字面量
浮点字面量可以以十进制或十六进制的形式表示。默认情况下,浮点字面量是 double
类型,但可以通过后缀 f
或 F
表示 float
类型,通过后缀 l
或 L
表示 long double
类型。
字面量类型 | 示例 |
---|---|
double | 3.14 、1.23e-10 、0x1.23p-10 |
float | 3.14f 、1.23e-10f 、0x1.23p-10f |
long double | 3.14L 、1.23e-10L 、0x1.23p-10L |
3. 类型特性
C++通过 <type_traits>
头文件提供了一些类型特性,可以用于在编译时检查和操作浮点型数据类型。例如,std::is_floating_point
可以检查一个类型是否为浮点型,std::numeric_limits
可以获取浮点型的精度、范围等信息。
4. 浮点数的精度和舍入
浮点数的精度是有限的,这意味着在进行浮点数运算时可能会出现舍入误差。例如,0.1
在计算机中不能精确表示,因此 0.1 + 0.2
的结果可能不是 0.3
。为了处理这种舍入误差,可以使用一些技巧,如使用 std::round
、std::floor
、std::ceil
等函数。
5. 浮点数的比较
由于浮点数的精度问题,直接比较两个浮点数是否相等可能会导致错误的结果。通常,比较浮点数时需要使用一个很小的阈值(epsilon)来判断它们是否足够接近。
bool nearlyEqual(float a, float b, float epsilon) {
return std::abs(a - b) < epsilon;
}
6. 示例代码
以下是一个示例代码,展示了如何使用C++中的浮点型数据类型和类型特性:
#include <iostream>
#include <type_traits>
#include <limits>
#include <cmath>
int main() {
// 基本浮点型
float f = 3.14f;
double d = 3.14;
long double ld = 3.14L;
// 浮点字面量
float f1 = 1.23e-10f;
double d1 = 1.23e-10;
long double ld1 = 1.23e-10L;
// 类型特性
std::cout << "float is floating point: " << std::is_floating_point<float>::value << std::endl;
std::cout << "double is floating point: " << std::is_floating_point<double>::value << std::endl;
std::cout << "long double is floating point: " << std::is_floating_point<long double>::value << std::endl;
// 获取浮点数的精度和范围
std::cout << "float digits: " << std::numeric_limits<float>::digits << std::endl;
std::cout << "double digits: " << std::numeric_limits<double>::digits << std::endl;
std::cout << "long double digits: " << std::numeric_limits<long double>::digits << std::endl;
std::cout << "float min: " << std::numeric_limits<float>::min() << std::endl;
std::cout << "double min: " << std::numeric_limits<double>::min() << std::endl;
std::cout << "long double min: " << std::numeric_limits<long double>::min() << std::endl;
std::cout << "float max: " << std::numeric_limits<float>::max() << std::endl;
std::cout << "double max: " << std::numeric_limits<double>::max() << std::endl;
std::cout << "long double max: " << std::numeric_limits<long double>::max() << std::endl;
// 浮点数的比较
float a = 0.1f + 0.2f;
float b = 0.3f;
float epsilon = 1e-6f;
std::cout << "0.1 + 0.2 == 0.3: " << (a == b) << std::endl;
std::cout << "0.1 + 0.2 nearly equal to 0.3: " << (std::abs(a - b) < epsilon) << std::endl;
return 0;
}
总结
C++中的浮点型数据类型包括 float
、double
和 long double
,它们用于表示小数和实数。浮点型数据类型在科学计算和工程应用中非常重要,但需要注意精度和舍入误差问题。通过 <type_traits>
和 <limits>
头文件,开发者可以更方便地检查和操作浮点型数据类型。
四、字符型
在C++中,字符型(char
)是一种基本数据类型,用于表示单个字符。字符型数据类型在处理文本和字符数据时非常有用。以下是C++中字符型数据类型的详细解析:
1. 基本字符型数据类型
C++中的基本字符型数据类型是 char
。char
类型的大小通常为1字节(8位),可以存储一个字符。char
类型可以是有符号的(signed char
)或无符号的(unsigned char
),具体取决于编译器的默认设置。
类型 | 大小(字节) | 取值范围 |
---|---|---|
char | 1 | -128 到 127(有符号)或 0 到 255(无符号) |
signed char | 1 | -128 到 127 |
unsigned char | 1 | 0 到 255 |
2. 字符字面量
字符字面量是用单引号括起来的单个字符。例如,'a'
、'1'
、' '
(空格)等。字符字面量在内存中存储的是字符的ASCII码值。
char c1 = 'a'; // 存储的是字符 'a' 的ASCII码值 97
char c2 = '1'; // 存储的是字符 '1' 的ASCII码值 49
char c3 = ' '; // 存储的是字符 ' ' 的ASCII码值 32
3. 转义字符
C++中提供了一些转义字符,用于表示一些特殊字符,如换行符、制表符、双引号等。转义字符以反斜杠 \
开头,后面跟着一个特定的字符或字符序列。
转义字符 | 说明 |
---|---|
\\ | 反斜杠 |
\' | 单引号 |
\" | 双引号 |
\? | 问号 |
\a | 警报(响铃) |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ooo | 八进制数(最多三位) |
\xhh | 十六进制数(至少一位,最多两位) |
4. 字符串字面量
字符串字面量是用双引号括起来的字符序列。例如,"Hello, World!"
。字符串字面量在内存中以空字符 '\0'
结尾,表示字符串的结束。
char str[] = "Hello, World!"; // 字符数组,存储字符串 "Hello, World!",最后一个元素是 '\0'
5. 类型特性
C++通过 <type_traits>
头文件提供了一些类型特性,可以用于在编译时检查和操作字符型数据类型。例如,std::is_integral
可以检查一个类型是否为整型,std::is_signed
和 std::is_unsigned
可以检查一个类型是否有符号。
6. 示例代码
以下是一个示例代码,展示了如何使用C++中的字符型数据类型和类型特性:
#include <iostream>
#include <type_traits>
#include <climits>
int main() {
// 基本字符型
char c1 = 'a';
signed char c2 = 'b';
unsigned char c3 = 'c';
// 字符字面量
char c4 = '1';
char c5 = ' ';
char c6 = '\n'; // 换行符
char c7 = '\\'; // 反斜杠
char c8 = '\"'; // 双引号
// 字符串字面量
char str[] = "Hello, World!";
// 类型特性
std::cout << "char is integral: " << std::is_integral<char>::value << std::endl;
std::cout << "signed char is signed: " << std::is_signed<signed char>::value << std::endl;
std::cout << "unsigned char is unsigned: " << std::is_unsigned<unsigned char>::value << std::endl;
// 字符的ASCII码值
std::cout << "ASCII value of 'a': " << static_cast<int>(c1) << std::endl;
std::cout << "ASCII value of '1': " << static_cast<int>(c4) << std::endl;
// 字符串长度
std::cout << "Length of string: " << sizeof(str) - 1 << std::endl; // sizeof(str) 包括 '\0'
return 0;
}
总结
C++中的字符型数据类型 char
用于表示单个字符,其大小通常为1字节。char
类型可以是有符号的或无符号的,具体取决于编译器的默认设置。字符字面量用单引号括起来,转义字符用于表示一些特殊字符。字符串字面量用双引号括起来,以空字符 '\0'
结尾。通过 <type_traits>
和 <climits>
头文件,开发者可以更方便地检查和操作字符型数据类型。
五、布尔型
在C++中,布尔型(bool
)是一种基本数据类型,用于表示逻辑值。布尔型数据类型在条件判断和逻辑运算中非常有用。以下是C++中布尔型数据类型的详细解析:
1. 基本布尔型数据类型
C++中的布尔型数据类型是 bool
。bool
类型的大小通常为1字节,但C++标准并没有严格规定其大小,只保证它足以存储两个不同的值:true
和 false
。
类型 | 大小(字节) | 取值范围 |
---|---|---|
bool | 通常为1 | true 或 false |
2. 布尔字面量
布尔型数据类型有两个字面量:true
和 false
。true
通常表示逻辑真,false
表示逻辑假。
bool b1 = true;
bool b2 = false;
3. 布尔型与整型的转换
在C++中,布尔型可以隐式转换为整型。true
转换为整型时值为1,false
转换为整型时值为0。反过来,整型也可以隐式转换为布尔型。非零整型值转换为 true
,零整型值转换为 false
。
bool b3 = 1; // b3 的值为 true
bool b4 = 0; // b4 的值为 false
int i1 = true; // i1 的值为 1
int i2 = false; // i2 的值为 0
4. 布尔运算
C++提供了多种布尔运算符,用于进行逻辑运算。这些运算符包括逻辑非(!
)、逻辑与(&&
)和逻辑或(||
)。
-
逻辑非(
!
):对布尔值取反。bool b5 = !true; // b5 的值为 false bool b6 = !false; // b6 的值为 true
-
逻辑与(
&&
):两个布尔值都为true
时结果为true
,否则为false
。bool b7 = true && true; // b7 的值为 true bool b8 = true && false; // b8 的值为 false
-
逻辑或(
||
):两个布尔值中有一个为true
时结果为true
,否则为false
。bool b9 = true || true; // b9 的值为 true bool b10 = true || false; // b10 的值为 true bool b11 = false || false; // b11 的值为 false
5. 布尔型在条件语句中的使用
布尔型数据类型在条件语句(如 if
、while
、for
)中非常常用。条件语句会根据布尔表达式的结果来决定是否执行特定的代码块。
int x = 10;
if (x > 5) {
std::cout << "x is greater than 5" << std::endl;
} else {
std::cout << "x is not greater than 5" << std::endl;
}
6. 示例代码
以下是一个示例代码,展示了如何使用C++中的布尔型数据类型和布尔运算:
#include <iostream>
int main() {
// 基本布尔型
bool b1 = true;
bool b2 = false;
// 布尔字面量
bool b3 = true;
bool b4 = false;
// 布尔型与整型的转换
bool b5 = 1; // b5 的值为 true
bool b6 = 0; // b6 的值为 false
int i1 = true; // i1 的值为 1
int i2 = false; // i2 的值为 0
// 布尔运算
bool b7 = !b1; // b7 的值为 false
bool b8 = b1 && b2; // b8 的值为 false
bool b9 = b1 || b2; // b9 的值为 true
// 输出结果
std::cout << "b1: " << b1 << std::endl;
std::cout << "b2: " << b2 << std::endl;
std::cout << "b5: " << b5 << std::endl;
std::cout << "b6: " << b6 << std::endl;
std::cout << "i1: " << i1 << std::endl;
std::cout << "i2: " << i2 << std::endl;
std::cout << "b7: " << b7 << std::endl;
std::cout << "b8: " << b8 << std::endl;
std::cout << "b9: " << b9 << std::endl;
// 条件语句
if (b1) {
std::cout << "b1 is true" << std::endl;
} else {
std::cout << "b1 is false" << std::endl;
}
if (b2) {
std::cout << "b2 is true" << std::endl;
} else {
std::cout << "b2 is false" << std::endl;
}
return 0;
}
总结
C++中的布尔型数据类型 bool
用于表示逻辑值,其取值范围为 true
和 false
。布尔型可以隐式转换为整型,反之亦然。C++提供了多种布尔运算符,用于进行逻辑运算。布尔型数据类型在条件语句中非常常用,用于控制程序的流程。通过这些特性,开发者可以方便地进行逻辑判断和条件控制。
六、空类型
在C++中,void
是一种特殊的数据类型,表示“无类型”或“空类型”。它用于表示没有值的情况,通常用于函数返回类型、函数参数列表、指针类型等。以下是C++中空类型 void
的详细解析:
1. void
作为函数返回类型
当一个函数没有返回值时,可以将其返回类型声明为 void
。这意味着该函数执行完毕后不会返回任何值。
void printMessage() {
std::cout << "Hello, World!" << std::endl;
}
2. void
作为函数参数类型
当一个函数不需要任何参数时,可以将其参数列表声明为 void
。这表示该函数不接受任何参数。
void printMessage(void) {
std::cout << "Hello, World!" << std::endl;
}
3. void
指针
void
指针是一种特殊的指针类型,可以指向任何类型的对象。void
指针在需要通用指针时非常有用,但必须先进行类型转换才能使用。
void* ptr = &x; // ptr 可以指向任何类型的对象
int* intPtr = static_cast<int*>(ptr); // 使用前需要进行类型转换
4. void
表达式
void
也可以用于将一个表达式转换为 void
类型,表示该表达式不返回任何值。这在某些情况下用于忽略返回值或避免编译器警告。
void ignoreReturnValue() {
(void)someFunctionThatReturnsAValue();
}
5. void
在模板编程中的应用
在模板编程中,void
有时用于类型特性检查和SFINAE(Substitution Failure Is Not An Error)技术。通过 void
类型,可以检查某个类型是否具有特定的成员或特性。
template <typename T, typename = void>
struct has_member_function : std::false_type {};
template <typename T>
struct has_member_function<T, std::void_t<decltype(std::declval<T>().memberFunction())>> : std::true_type {};
6. 示例代码
以下是一个示例代码,展示了如何使用C++中的 void
类型:
#include <iostream>
#include <type_traits>
// 1. void 作为函数返回类型
void printMessage() {
std::cout << "Hello, World!" << std::endl;
}
// 2. void 作为函数参数类型
void printMessageWithVoid(void) {
std::cout << "Hello, World with void!" << std::endl;
}
// 3. void 指针
void useVoidPointer() {
int x = 10;
void* ptr = &x; // ptr 可以指向任何类型的对象
int* intPtr = static_cast<int*>(ptr); // 使用前需要进行类型转换
std::cout << "Value: " << *intPtr << std::endl;
}
// 4. void 表达式
void ignoreReturnValue() {
(void)std::cout << "Ignoring return value" << std::endl;
}
// 5. void 在模板编程中的应用
template <typename T, typename = void>
struct has_member_function : std::false_type {};
template <typename T>
struct has_member_function<T, std::void_t<decltype(std::declval<T>().memberFunction())>> : std::true_type {};
struct A {
void memberFunction() {}
};
struct B {};
int main() {
printMessage();
printMessageWithVoid();
useVoidPointer();
ignoreReturnValue();
std::cout << "A has member function: " << has_member_function<A>::value << std::endl;
std::cout << "B has member function: " << has_member_function<B>::value << std::endl;
return 0;
}
总结
C++中的 void
类型表示“无类型”或“空类型”,用于表示没有值的情况。void
可以作为函数返回类型、函数参数类型、指针类型等。void
指针是一种通用指针,可以指向任何类型的对象,但使用前需要进行类型转换。void
也可以用于将表达式转换为 void
类型,以忽略返回值或避免编译器警告。在模板编程中,void
用于类型特性检查和SFINAE技术。通过这些特性,开发者可以更灵活地处理类型和表达式。
七、类型修饰符
在 C++ 中,类型修饰符(Type Modifiers)是用来改变基本数据类型(如 int、char 等)的长度、精度、存储方式等特性的关键字。以下是对 C++ 中常见类型修饰符的详细解释:
1. signed 和 unsigned
- 作用:用于修饰整数类型(如 int、char 等),表示该整数是有符号的还是无符号的。
- signed:
- 含义:表示该整数类型可以表示正数、负数和零。这是整数类型的默认修饰符,例如 int 默认为 signed int。
- 示例:
signed int a = -10;
,a 可以存储 -10 这样的负数。
- unsigned:
- 含义:表示该整数类型只能表示零和正数,不能表示负数。由于没有用于表示符号的位,其数值范围比对应的 signed 类型大一倍。
- 示例:
unsigned int b = 10;
,b 可以存储 10,但不能存储 -10。对于 unsigned char,其取值范围通常是 0 到 255,而 signed char 的取值范围可能是 -128 到 127。
2. short 和 long
- 作用:用于修饰整数类型,改变其存储长度。
- short:
- 含义:表示短整型,通常占用的存储空间比标准 int 类型少。在大多数平台上,short 通常占用 2 个字节。
- 示例:
short c = 100;
,c 占用的存储空间相对较小,适用于存储范围较小的整数。
- long:
- 含义:表示长整型,占用的存储空间比标准 int 类型多,可以存储更大的整数。在 32 位平台上,long 通常占用 4 个字节;在 64 位平台上,long 的大小可能因编译器而异,可能是 4 个字节或 8 个字节。
- 示例:
long d = 1000000000;
,d 可以存储比 int 类型更大的整数。
3. long long
- 作用:用于修饰整数类型,表示更长的长整型。
- 含义:通常占用 8 个字节,可以存储非常大的整数。其取值范围比 long 类型更大,适用于需要处理大整数的场景。
- 示例:
long long e = 1000000000000000000;
,e 可以存储非常大的整数。
4. float 和 double
- 作用:用于修饰浮点数类型,表示浮点数的精度和存储长度。
- float:
- 含义:表示单精度浮点数,通常占用 4 个字节,提供大约 7 位十进制数的精度。
- 示例:
float f = 3.1415926;
,f 可以存储浮点数,但精度有限。
- double:
- 含义:表示双精度浮点数,通常占用 8 个字节,提供大约 15 位十进制数的精度,比 float 类型更精确。
- 示例:
double g = 3.14159265358979323846;
,g 可以存储更高精度的浮点数。
5. long double
- 作用:用于修饰浮点数类型,表示更长的双精度浮点数。
- 含义:通常占用 12 个字节或更多,提供比 double 类型更高的精度,适用于需要极高精度的科学计算等场景。
- 示例:
long double h = 3.14159265358979323846264338327950288419716939937510;
,h 可以存储极高精度的浮点数。
使用场景
- unsigned:在处理数组索引、循环计数器等非负整数场景时,使用 unsigned 类型可以充分利用存储空间,表示更大的正数范围。
- short:在内存受限的嵌入式系统或需要存储大量小整数的场景中,使用 short 类型可以节省存储空间。
- long long:在处理大整数运算,如密码学中的大数运算、大规模数据统计等场景中,使用 long long 类型可以避免整数溢出。
- double 和 long double:在科学计算、金融计算等需要高精度浮点数运算的场景中,使用 double 或 long double 类型可以提高计算精度。
类型修饰符在 C++ 中非常重要,它们可以帮助开发者根据具体需求选择合适的数据类型,优化程序的性能和内存使用。