C++数据类型有哪些
C++语言提供了各种不同类型的数据类型,用于存储不同类型的数据。以下是C++的一些常见数据类型:
- 整数类型:int、short、long、long long
- 无符号整数类型:unsigned int、unsigned short、unsigned long、unsigned long long
- 字符类型:char
- 布尔类型:bool
- 浮点数类型:float、double
- 双精度浮点数类型:long double
- 数组类型:用于存储相同类型的一系列元素
- 结构体类型:用于定义一组不同类型的数据作为一个单独的实体
- 枚举类型:用于定义一组具有离散值的常量
- 指针类型:
- 指针类型:用于存储内存地址
- 其他数据类型:
- 空类型:void,用于表示无类型或无返回值的函数
此外,C++还支持用户自定义的数据类型,通过类和对象的方式来创建。今天只说基本数据类型。
整数类型:int、short、long、long long
发小和范围
int、short、long和long long是C++中的整数类型,它们在大小和范围上有所不同:
- int类型:
- 大小:通常为4字节(32位)。
- 范围:基于编译器和平台,一般范围为约-2,147,483,648到2,147,483,647。
- short类型:
- 大小:通常为2字节(16位)。
- 范围:基于编译器和平台,一般范围为约-32,768到32,767。
- long类型:
- 大小:通常为4字节(32位),但在一些平台上可能为8字节(64位)。
- 范围:基于编译器和平台,32位long类型的范围约为-2,147,483,648到2,147,483,647,64位long类型的范围更大。
- long long类型:
- 大小:通常为8字节(64位)。
- 范围:基于编译器和平台,范围约为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
这些类型的大小和范围可以因编译器和平台而异,因此在编写代码时应注意兼容性。可以使用 <limits>
头文件中的特殊常量来获取每种类型的最大和最小值,例如 INT_MAX
、INT_MIN
等。
初始化、计算、转换
以下是四种整数类型的声明、字节数、初始化和类型转换的示例:
- int类型:
- 声明和初始化:
int number; // 声明一个int类型变量 number = 10; // 初始化变量为10 int value = 20; // 声明并初始化变量为20
- 字节数:通常为4字节(32位)。
- 类型转换:int类型可以隐式地转换为更小范围的整数类型,但需要注意溢出问题。也可以使用显式的类型转换操作符进行类型转换,例如:
int number = 100; short s = static_cast<short>(number); // 使用static_cast进行int到short的显式类型转换
- short类型:
- 声明和初始化:
short number; // 声明一个short类型变量 number = 5; // 初始化变量为5 short value = 7; // 声明并初始化变量为7
- 字节数:通常为2字节(16位)。
- 类型转换:short类型可以隐式地转换为更小范围的整数类型,但需要注意溢出问题。也可以使用显式的类型转换操作符进行类型转换。
- long类型:
- 声明和初始化:
long number; // 声明一个long类型变量 number = 1000; // 初始化变量为1000 long value = 5000; // 声明并初始化变量为5000
- 字节数:通常为4字节(32位),但在一些平台上可能为8字节(64位)。
- 类型转换:long类型可以隐式地转换为更小范围的整数类型,但需要注意溢出问题。也可以使用显式的类型转换操作符进行类型转换。
- long long类型:
- 声明和初始化:
long long number; // 声明一个long long类型变量 number = 10000000000; // 初始化变量为10000000000 long long value = 50000000000; // 声明并初始化变量为50000000000
- 字节数:通常为8字节(64位)。
- 类型转换:long long类型可以隐式地转换为更小范围的整数类型,但需要注意溢出问题。也可以使用显式的类型转换操作符进行类型转换。
不同大小的整数类型之间的转换,可能会导致数据丢失或溢出的问题。在进行类型转换时,最好使用显式的类型转换操作符,以确保转换的准确性或进行边界检查。
sizeof
是一个C++的运算符,不是函数
sizeof x; sizeof(x); //得到的结果是一样的;
sizeof
是一个C++的运算符,用于获取对象或类型的大小(以字节为单位)。它可以用于计算各种类型的大小,包括内置类型、数组、结构体、类等。
sizeof
运算符的使用方法如下:
- 对象的大小:
例如,获取int
类型对象的大小:
int number; size_t size = sizeof(number);
- 类型的大小:
例如,获取int
类型的大小:
size_t size = sizeof(int);
- 数组的大小:
例如,获取int
类型数组的大小:
int arr[5]; size_t size = sizeof(arr);
sizeof运算符返回的是
size_t类型的值,表示以字节为单位的大小。在实际使用中,可以将结果除以
sizeof(type)` 来获取有关对象或数组中元素的数量。
sizeof
运算符是在编译期间计算的,不会对表达式进行实际求值,因此可以用于静态地获取类型或对象的大小信息。
无符号整数类型 :unsigned int、unsigned short、unsigned long、unsigned long long
无符号整数类型(unsigned int、unsigned short、unsigned long、unsigned long long)是C++中的整数类型,用于存储大于等于零的整数值。它们的特点是不带符号位,因此可以表示更大的正整数范围。
下面是每个无符号整数类型的简要介绍:
- unsigned int类型(无符号整数):
- 字节数:通常为4字节(32位)。
- 范围:0到约4294967295。
- unsigned short类型(无符号短整数):
- 字节数:通常为2字节(16位)。
- 范围:0到约65535。
- unsigned long类型(无符号长整数):
- 字节数:通常为4字节(32位),但在一些平台上可能为8字节(64位)。
- 范围:0到约4294967295(如果为32位)或0到约18446744073709551615(如果为64位)。
- unsigned long long类型(无符号长长整数):
- 字节数:通常为8字节(64位)。
- 范围:0到约18446744073709551615。
无符号整数类型的关键字 “unsigned” 表示它们是无符号的,即只能表示非负数。这意味着在使用无符号整数时,没有符号位用于表示负数,因此可以表示更大的正整数范围。但也要注意,使用无符号整数时需要小心溢出和类型转换的问题。
无符号整数类型的初始化、计算、转换
无符号整数类型的初始化、计算和转换与有符号整数类型类似,但需要注意一些细节。以下是关于无符号整数类型的初始化、计算和转换的说明:
- 初始化:
无符号整数类型可以使用常量值进行初始化。例如:
unsigned int num1 = 10; unsigned short num2 = 5; unsigned long num3 = 1000; unsigned long long num4 = 5000000;
- 计算:
无符号整数类型可以进行常规的算术和逻辑运算,包括加法、减法、乘法、除法和取模等。需要注意的是,由于无符号整数没有符号位,因此在进行减法运算时需要确保不会出现负数结果。例如:
unsigned int num1 = 10; unsigned int num2 = 5; unsigned int result1 = num1 + num2; // 加法运算 unsigned int result2 = num1 - num2; // 减法运算 (num1 >= num2) unsigned int result3 = num1 * num2; // 乘法运算 unsigned int result4 = num1 / num2; // 除法运算 unsigned int result5 = num1 % num2; // 取模运算
- 转换:
无符号整数类型可以进行隐式或显式的类型转换。当将一个有符号整数类型的值赋给无符号整数类型时,如果数值在无符号类型的表示范围内,则值不变;如果超出范围,则会进行模运算。例如:
int num1 = -10; unsigned int num2 = num1; // 隐式转换,结果为4294967286 (2^32 - 10) unsigned short num3 = 65000; unsigned int num4 = static_cast<unsigned int>(num3); // 显式转换,结果为65000
在进行无符号整数类型之间的转换时,可以进行隐式转换,但要注意溢出问题和类型大小。在进行有符号整数类型和无符号整数类型之间的转换时,最好使用显示的类型转换操作符,以明确转换的意图并避免潜在的错误。
字符类型:char
在C++中,字符类型 char
用于表示单个字符,并使用ASCII编码。它是一种整数类型,通常占用1个字节(8位)。以下是关于 char
类型的一些说明:
- 初始化:
char
类型可以通过单个字符来进行初始化。例如:
char ch1 = 'A'; // 使用单引号初始化 char ch2 = 65; // 使用整数值初始化,对应ASCII码中的字符 'A' char ch3 = '\n'; // 使用转义字符初始化,表示换行符
- 字符串:
在C++中,char
类型也可以用于表示字符数组,即字符串。字符串是由多个字符组成的字符序列,以null终止。例如:
char str1[] = "Hello"; // 声明并初始化一个字符串 char str2[10]; // 声明一个字符数组(字符串) strcpy(str2, "World"); // 将字符串复制到字符数组中
- 输出:
可以使用输出流对象如cout
来输出字符类型的值。例如:
char ch = 'A'; cout << ch; // 输出字符 'A'
- 强制类型转换:
char
类型可以被强制转换为其他整数类型,例如int
。可以使用静态类型转换操作符static_cast
进行转换,如下所示:
char ch = 'A'; int num = static_cast<int>(ch); // 将字符 'A' 强制转换为整数 65
虽然 char
类型通常用于表示字符,但它实际上是一个整数类型。在进行字符类型的计算和操作时,可以看作是对ASCII码值的操作。同时,char
类型有无符号和有符号两种形式 (unsigned char
和 signed char
)。默认情况下,char
类型是有符号的,但具体实现可能会有所不同。
布尔类型:bool
在C++中,布尔类型 bool
用于表示逻辑值,只有两个取值:true
和 false
。bool
类型主要用于控制流程和条件判断。
以下是布尔类型的一些说明:
- 初始化:
bool
类型可以通过true
或者false
来进行初始化。例如:
bool flag1 = true; // 初始化为true bool flag2 = false; // 初始化为false
- 条件判断:
布尔类型常用于条件判断,例如if
语句和循环语句中。只有当条件为true
时,相应的代码块才会执行。例如:
bool isTrue = true; if (isTrue) { // 条件为真,执行这里的代码 cout << "Condition is true!"; }
- 逻辑运算:
布尔类型可以进行逻辑运算,包括逻辑与&&
、逻辑或||
和逻辑非!
。逻辑运算的结果也是布尔类型。例如:
bool condition1 = true; bool condition2 = false; bool result1 = condition1 && condition2; // 逻辑与,结果为false bool result2 = condition1 || condition2; // 逻辑或,结果为true bool result3 = !condition1; // 逻辑非,结果为false
- 比较运算:
布尔类型可以进行比较运算,如等于==
和不等于!=
。比较运算的结果也是布尔类型。例如:
bool result1 = (10 == 5); // 结果为false bool result2 = (10 != 5); // 结果为true
布尔类型在内存中通常占用1个字节的空间,但实际上其值只能是 true
或者 false
。在进行值的赋值、计算或比较时,可以使用布尔类型来简洁地表达逻辑关系。
浮点数类型:float、double
在C++中,浮点数类型主要由 float
和 double
两种表示。
以下是关于这两种浮点数类型的说明:
- float 类型:
- 字节数:通常为4字节(32位)。
- 表示范围:约 ±3.402823466e+38F (14位有效数字)。
- 精度:通常为6位有效数字。
- 初始化:可以使用浮点数常量、整数常量或转换来初始化。
float f1 = 3.14f; // 使用浮点数常量初始化 float f2 = 10; // 使用整数初始化,会进行隐式类型转换 float f3 = static_cast<float>(5); // 使用显式类型转换初始化
- double 类型:
- 字节数:通常为8字节(64位)。
- 表示范围:约 ±1.7976931348623158e+308 (15位有效数字)。
- 精度:通常为15位有效数字。
- 初始化:可以使用浮点数常量、整数常量或转换来初始化。
double d1 = 3.14; // 使用浮点数常量初始化 double d2 = 10; // 使用整数初始化,会进行隐式类型转换 double d3 = static_cast<double>(5); // 使用显式类型转换初始化
注意事项:
- 浮点数类型的精度是有限的,计算过程中可能会存在舍入误差。
- 使用浮点数进行计算时,尤其是比较大小或判断相等时,应考虑舍入误差可能导致的不精确性。可以使用适当的容差值进行比较。
- 在使用浮点数时,应注意避免除以零或进行无效的运算,这可能会导致NaN(非数字)的结果。
根据具体需求和精确性要求,选择适当的浮点数类型。如果需要更高的精度,则可以考虑使用 long double
类型,它的字节数通常为10或16字节。
双精度浮点数类型:long double
在C++中,除了 float
和 double
,还有一种双精度浮点数类型称为 long double
。long double
提供了更高的精度和范围,相比于 double
类型而言。
以下是关于 long double
类型的说明:
- 字节数:通常为8字节(64位)或16字节(128位),具体取决于编译器和操作系统。
- 在大多数常见的系统上,
long double
的长度为8字节,与double
相同。 - 在一些特定的环境中,可支持更高精度的
long double
类型,长度为16字节(128位)。
- 范围和精度:由于
long double
的字节数更高,可以表示的范围和精度比double
更大。具体范围和精度因系统而异,请参考相关文档以获取准确信息。 - 初始化:可以使用浮点数常量、整数常量或转换来初始化
long double
类型。
long double ld1 = 3.14L; // 使用浮点数常量初始化,后缀 L 表示 long double 类型 long double ld2 = 10; // 使用整数初始化,会进行隐式类型转换 long double ld3 = static_cast<long double>(5); // 使用显式类型转换初始化
使用 long double
类型的变量可能导致更高的内存消耗。在选择使用 long double
还是 double
时,应权衡精度要求和性能/内存开销之间的平衡。对于大多数普通应用,使用 double
类型已经足够满足需求。只有在需要非常高的精度时,才考虑使用 long double
类型。
字符串的不同表示方法
在C++中,字符串可以有多种不同的表示方法。以下是几种常见的字符串表示方式:
- 字符数组:
- 使用字符数组来存储字符串,数组的每个元素都是一个字符。
- 字符数组最后一位通常为字符串的结束符
'\0'
,也称为null终止符。 - 示例:
char str1[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 手动指定字符串的每个字符 char str2[6]; str2[0] = 'W'; str2[1] = 'o'; str2[2] = 'r'; str2[3] = 'l'; str2[4] = 'd'; str2[5] = '\0'; // 使用字符数组逐个赋值构建字符串
- 字符串常量:
- 使用双引号
""
将字符序列括起来表示字符串常量。 - 字符串常量在内存中处于只读区域,并且以null终止符结尾。
- 示例:
const char* str3 = "Hello"; // 使用字符串常量初始化字符指针
- string 类型:
- 使用C++标准库头文件
<string>
中提供的 string 类型来表示和操作字符串。 - string 类型提供了许多方便的成员函数和操作符,使字符串的处理更加简单。
- 示例:
#include <string> std::string str4 = "Hello"; // 使用 string 类型初始化字符串
- 字符指针:
- 使用字符指针来访问字符串的地址,可以使用字符数组或字符串常量的地址。
- 示例:
const char* str5 = str3; // 使用字符指针指向字符串常量 char* str6 = str1; // 使用字符指针指向字符数组
在处理字符串时,应当注意字符串的长度和内存空间的管理,避免造成缓冲区溢出等安全问题。如果需要对字符串进行多次操作,并且需要动态分配内存、自动管理长度等功能,推荐使用C++标准库提供的 string 类型。
关注我,不迷路,共学习,同进步