C++ 中的数据类型分为四大类:基本数据类型、派生数据类型、用户定义的数据类型和空类型。每类都有特定的用途和特性。
1. 基本数据类型(Built-in Data Types)
这是 C++ 中最基本的数据类型,包含整数、浮点数、字符和布尔类型。
-
整数类型(Integer Types):
int
:标准整数类型。short int
或short
:较小的整数类型。long int
或long
:较大的整数类型。long long int
或long long
:更大的整数类型(C++11 引入)。unsigned int
:无符号整数,不能表示负数,值域范围变大。
-
浮点类型(Floating-point Types):
float
:单精度浮点数。double
:双精度浮点数,精度比float
更高。long double
:扩展精度浮点数。
-
字符类型(Character Type):
char
:用于存储单个字符(实际上是整数类型)。
-
布尔类型(Boolean Type):
bool
:只包含true
或false
两个值。
2. 派生数据类型(Derived Data Types)
派生数据类型是从基本数据类型中构建的。
- 数组(Arrays):存储一系列相同类型的元素。
int arr[10]; // 定义一个存储 10 个整数的数组
- 指针(Pointers):存储另一个变量的地址。
int* ptr; // 定义一个指向整数的指针
- 函数(Functions):函数类型指定返回类型及参数类型。
int func(int a, float b); // 返回 int,接受 int 和 float 参数
- 引用(References):是变量的别名。
int x = 10; int& ref = x; // ref 是 x 的引用
3. 用户定义的数据类型(User-defined Data Types)
用户可以根据需求定义自己的数据类型。
- 类(Classes):类是 C++ 中面向对象编程的核心,定义对象的行为和属性。
class MyClass { public: int myVar; };
- 结构体(Structures):类似类,但成员默认为公有(
public
)。struct MyStruct { int x; float y; };
- 联合体(Unions):用于同一内存位置存储不同的数据类型。
union MyUnion { int i; float f; };
- 枚举(Enumerations):定义一组常量。
enum Color { Red, Green, Blue };
4. 空类型(Void Type)
void
:表示函数无返回值或无参数。void func(); // 无返回值的函数
此外,C++ 还支持 C++11 及以上标准引入的类型,如 auto
自动推断类型、nullptr
表示空指针以及 decltype
用于声明类型等。
在 C++ 中,数据类型的大小取决于编译器和硬件平台的实现。以下是常见数据类型在大多数 32 位或 64 位系统上的典型大小。请注意,这些大小是常见的,但在不同的平台上可能有所不同。
1. 基本数据类型的大小
-
char
: 1 字节(8 位),用于存储单个字符或小整数。 -
bool
: 1 字节(尽管只需要 1 位,通常用 1 字节来存储)。 -
int
: 通常是 4 字节(32 位),这可以在 32 位和 64 位系统上相同。 -
short int
/short
: 2 字节(16 位)。 -
long int
/long
: 通常是 4 字节(32 位),但在某些 64 位系统上也可能是 8 字节。 -
long long int
/long long
: 8 字节(64 位),从 C++11 开始引入,用于表示更大的整数。 -
unsigned
类型: 与对应的有符号类型相同。例如,unsigned int
通常也是 4 字节。 -
浮点类型:
float
: 4 字节(32 位),单精度浮点数。double
: 8 字节(64 位),双精度浮点数。long double
: 通常是 8 字节(64 位),但有些系统上可能为 12 字节或 16 字节(如 x86 平台上的扩展精度格式)。
2. 派生数据类型的大小
- 数组: 数组的大小是其元素大小乘以元素个数。例如,
int arr[10]
的大小是sizeof(int) * 10
。 - 指针: 在 32 位系统上,指针的大小是 4 字节;在 64 位系统上,指针的大小通常是 8 字节。
- 函数: 函数本身没有“大小”,但指向函数的指针与普通指针具有相同的大小(4 字节或 8 字节)。
3. 用户定义的数据类型的大小
-
结构体(struct): 结构体的大小是所有成员大小的总和,加上必要的内存对齐。如果结构体中存在不同类型的数据,编译器通常会插入填充字节以确保数据正确对齐。
struct MyStruct { char a; // 1 byte int b; // 4 bytes (with possible padding for alignment) };
在这种情况下,
MyStruct
的大小可能是 8 字节(char
1 字节,int
4 字节,加上 3 字节的填充)。 -
类(class): 类的大小与结构体相似,但如果类有虚函数,则需要额外的空间来存储虚函数表指针(通常为 4 字节或 8 字节)。
-
联合体(union): 联合体的大小是其中最大成员的大小。因为在联合体中,所有成员共用同一块内存。
-
枚举(enum): 枚举类型通常与
int
大小相同(4 字节),但这可以根据枚举的实际值的范围来调整。
4. 空类型(void)
void
: 没有大小,因为它不存储任何数据。
示例代码:查看数据类型的大小
你可以使用 sizeof
运算符来查看每种数据类型在特定平台上的实际大小:
#include <iostream>
using namespace std;
int main() {
cout << "Size of char: " << sizeof(char) << " bytes\n";
cout << "Size of int: " << sizeof(int) << " bytes\n";
cout << "Size of short: " << sizeof(short) << " bytes\n";
cout << "Size of long: " << sizeof(long) << " bytes\n";
cout << "Size of long long: " << sizeof(long long) << " bytes\n";
cout << "Size of float: " << sizeof(float) << " bytes\n";
cout << "Size of double: " << sizeof(double) << " bytes\n";
cout << "Size of long double: " << sizeof(long double) << " bytes\n";
cout << "Size of bool: " << sizeof(bool) << " bytes\n";
return 0;
}
典型输出示例(在 64 位系统上):
Size of char: 1 bytes
Size of int: 4 bytes
Size of short: 2 bytes
Size of long: 8 bytes
Size of long long: 8 bytes
Size of float: 4 bytes
Size of double: 8 bytes
Size of long double: 16 bytes
Size of bool: 1 bytes
结论
char
总是 1 字节。- 整数类型 (
int
,short
,long
,long long
) 的大小依赖平台。 - 浮点类型 (
float
,double
,long double
) 通常为 4 字节、8 字节或更大。 - 指针的大小取决于系统架构(32 位或 64 位)。