C++学习之基本数据类型_学习

C++数据类型有哪些

C++语言提供了各种不同类型的数据类型,用于存储不同类型的数据。以下是C++的一些常见数据类型:

  1. 基本数据类型:
  • 整数类型:int、short、long、long long
  • 无符号整数类型:unsigned int、unsigned short、unsigned long、unsigned long long
  • 字符类型:char
  • 布尔类型:bool
  • 浮点数类型:float、double
  • 双精度浮点数类型:long double
  1. 复合数据类型:
  • 数组类型:用于存储相同类型的一系列元素
  • 结构体类型:用于定义一组不同类型的数据作为一个单独的实体
  • 枚举类型:用于定义一组具有离散值的常量
  1. 指针类型:
  • 指针类型:用于存储内存地址
  1. 其他数据类型:
  • 空类型:void,用于表示无类型或无返回值的函数

此外,C++还支持用户自定义的数据类型,通过类和对象的方式来创建。今天只说基本数据类型。

整数类型:int、short、long、long long

发小和范围

int、short、long和long long是C++中的整数类型,它们在大小和范围上有所不同:

  1. int类型:
  • 大小:通常为4字节(32位)。
  • 范围:基于编译器和平台,一般范围为约-2,147,483,648到2,147,483,647。
  1. short类型:
  • 大小:通常为2字节(16位)。
  • 范围:基于编译器和平台,一般范围为约-32,768到32,767。
  1. long类型:
  • 大小:通常为4字节(32位),但在一些平台上可能为8字节(64位)。
  • 范围:基于编译器和平台,32位long类型的范围约为-2,147,483,648到2,147,483,647,64位long类型的范围更大。
  1. long long类型:
  • 大小:通常为8字节(64位)。
  • 范围:基于编译器和平台,范围约为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。

这些类型的大小和范围可以因编译器和平台而异,因此在编写代码时应注意兼容性。可以使用 <limits> 头文件中的特殊常量来获取每种类型的最大和最小值,例如 INT_MAXINT_MIN 等。

初始化、计算、转换

以下是四种整数类型的声明、字节数、初始化和类型转换的示例:

  1. 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的显式类型转换
  1. short类型:
  • 声明和初始化:
short number; // 声明一个short类型变量
number = 5; // 初始化变量为5
short value = 7; // 声明并初始化变量为7
  • 字节数:通常为2字节(16位)。
  • 类型转换:short类型可以隐式地转换为更小范围的整数类型,但需要注意溢出问题。也可以使用显式的类型转换操作符进行类型转换。
  1. long类型:
  • 声明和初始化:
long number; // 声明一个long类型变量
number = 1000; // 初始化变量为1000
long value = 5000; // 声明并初始化变量为5000
  • 字节数:通常为4字节(32位),但在一些平台上可能为8字节(64位)。
  • 类型转换:long类型可以隐式地转换为更小范围的整数类型,但需要注意溢出问题。也可以使用显式的类型转换操作符进行类型转换。
  1. 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 运算符的使用方法如下:

  1. 对象的大小:
    例如,获取 int 类型对象的大小:
int number;
size_t size = sizeof(number);
  1. 类型的大小:
    例如,获取 int 类型的大小:
size_t size = sizeof(int);
  1. 数组的大小:
    例如,获取 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++中的整数类型,用于存储大于等于零的整数值。它们的特点是不带符号位,因此可以表示更大的正整数范围。

下面是每个无符号整数类型的简要介绍:

  1. unsigned int类型(无符号整数):
  • 字节数:通常为4字节(32位)。
  • 范围:0到约4294967295。
  1. unsigned short类型(无符号短整数):
  • 字节数:通常为2字节(16位)。
  • 范围:0到约65535。
  1. unsigned long类型(无符号长整数):
  • 字节数:通常为4字节(32位),但在一些平台上可能为8字节(64位)。
  • 范围:0到约4294967295(如果为32位)或0到约18446744073709551615(如果为64位)。
  1. unsigned long long类型(无符号长长整数):
  • 字节数:通常为8字节(64位)。
  • 范围:0到约18446744073709551615。

无符号整数类型的关键字 “unsigned” 表示它们是无符号的,即只能表示非负数。这意味着在使用无符号整数时,没有符号位用于表示负数,因此可以表示更大的正整数范围。但也要注意,使用无符号整数时需要小心溢出和类型转换的问题。

无符号整数类型的初始化、计算、转换

无符号整数类型的初始化、计算和转换与有符号整数类型类似,但需要注意一些细节。以下是关于无符号整数类型的初始化、计算和转换的说明:

  1. 初始化:
    无符号整数类型可以使用常量值进行初始化。例如:
unsigned int num1 = 10;
unsigned short num2 = 5;
unsigned long num3 = 1000;
unsigned long long num4 = 5000000;
  1. 计算:
    无符号整数类型可以进行常规的算术和逻辑运算,包括加法、减法、乘法、除法和取模等。需要注意的是,由于无符号整数没有符号位,因此在进行减法运算时需要确保不会出现负数结果。例如:
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; // 取模运算
  1. 转换:
    无符号整数类型可以进行隐式或显式的类型转换。当将一个有符号整数类型的值赋给无符号整数类型时,如果数值在无符号类型的表示范围内,则值不变;如果超出范围,则会进行模运算。例如:
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 类型的一些说明:

  1. 初始化:
    char 类型可以通过单个字符来进行初始化。例如:
char ch1 = 'A'; // 使用单引号初始化
char ch2 = 65; // 使用整数值初始化,对应ASCII码中的字符 'A'
char ch3 = '\n'; // 使用转义字符初始化,表示换行符
  1. 字符串:
    在C++中,char 类型也可以用于表示字符数组,即字符串。字符串是由多个字符组成的字符序列,以null终止。例如:
char str1[] = "Hello"; // 声明并初始化一个字符串
char str2[10]; // 声明一个字符数组(字符串)
strcpy(str2, "World"); // 将字符串复制到字符数组中
  1. 输出:
    可以使用输出流对象如 cout 来输出字符类型的值。例如:
char ch = 'A';
cout << ch; // 输出字符 'A'
  1. 强制类型转换:
    char 类型可以被强制转换为其他整数类型,例如 int。可以使用静态类型转换操作符 static_cast 进行转换,如下所示:
char ch = 'A';
int num = static_cast<int>(ch); // 将字符 'A' 强制转换为整数 65

虽然 char 类型通常用于表示字符,但它实际上是一个整数类型。在进行字符类型的计算和操作时,可以看作是对ASCII码值的操作。同时,char 类型有无符号和有符号两种形式 (unsigned charsigned char)。默认情况下,char 类型是有符号的,但具体实现可能会有所不同。

布尔类型:bool

在C++中,布尔类型 bool 用于表示逻辑值,只有两个取值:truefalsebool 类型主要用于控制流程和条件判断。

以下是布尔类型的一些说明:

  1. 初始化:
    bool 类型可以通过 true 或者 false 来进行初始化。例如:
bool flag1 = true; // 初始化为true
bool flag2 = false; // 初始化为false
  1. 条件判断:
    布尔类型常用于条件判断,例如 if 语句和循环语句中。只有当条件为 true 时,相应的代码块才会执行。例如:
bool isTrue = true;
if (isTrue) {
    // 条件为真,执行这里的代码
    cout << "Condition is true!";
}
  1. 逻辑运算:
    布尔类型可以进行逻辑运算,包括逻辑与 &&、逻辑或 || 和逻辑非 !。逻辑运算的结果也是布尔类型。例如:
bool condition1 = true;
bool condition2 = false;
bool result1 = condition1 && condition2; // 逻辑与,结果为false
bool result2 = condition1 || condition2; // 逻辑或,结果为true
bool result3 = !condition1; // 逻辑非,结果为false
  1. 比较运算:
    布尔类型可以进行比较运算,如等于 == 和不等于 !=。比较运算的结果也是布尔类型。例如:
bool result1 = (10 == 5); // 结果为false
bool result2 = (10 != 5); // 结果为true

布尔类型在内存中通常占用1个字节的空间,但实际上其值只能是 true 或者 false。在进行值的赋值、计算或比较时,可以使用布尔类型来简洁地表达逻辑关系。

浮点数类型:float、double

在C++中,浮点数类型主要由 floatdouble 两种表示。

以下是关于这两种浮点数类型的说明:

  1. float 类型:
  • 字节数:通常为4字节(32位)。
  • 表示范围:约 ±3.402823466e+38F (14位有效数字)。
  • 精度:通常为6位有效数字。
  • 初始化:可以使用浮点数常量、整数常量或转换来初始化。
float f1 = 3.14f; // 使用浮点数常量初始化
float f2 = 10; // 使用整数初始化,会进行隐式类型转换
float f3 = static_cast<float>(5); // 使用显式类型转换初始化
  1. 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++中,除了 floatdouble,还有一种双精度浮点数类型称为 long doublelong double 提供了更高的精度和范围,相比于 double 类型而言。

以下是关于 long double 类型的说明:

  1. 字节数:通常为8字节(64位)或16字节(128位),具体取决于编译器和操作系统。
  • 在大多数常见的系统上,long double 的长度为8字节,与 double 相同。
  • 在一些特定的环境中,可支持更高精度的 long double 类型,长度为16字节(128位)。
  1. 范围和精度:由于 long double 的字节数更高,可以表示的范围和精度比 double 更大。具体范围和精度因系统而异,请参考相关文档以获取准确信息。
  2. 初始化:可以使用浮点数常量、整数常量或转换来初始化 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++中,字符串可以有多种不同的表示方法。以下是几种常见的字符串表示方式:

  1. 字符数组:
  • 使用字符数组来存储字符串,数组的每个元素都是一个字符。
  • 字符数组最后一位通常为字符串的结束符 '\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'; // 使用字符数组逐个赋值构建字符串
  1. 字符串常量:
  • 使用双引号 "" 将字符序列括起来表示字符串常量。
  • 字符串常量在内存中处于只读区域,并且以null终止符结尾。
  • 示例:
const char* str3 = "Hello"; // 使用字符串常量初始化字符指针
  1. string 类型:
  • 使用C++标准库头文件 <string> 中提供的 string 类型来表示和操作字符串。
  • string 类型提供了许多方便的成员函数和操作符,使字符串的处理更加简单。
  • 示例:
#include <string>
std::string str4 = "Hello"; // 使用 string 类型初始化字符串
  1. 字符指针:
  • 使用字符指针来访问字符串的地址,可以使用字符数组或字符串常量的地址。
  • 示例:
const char* str5 = str3; // 使用字符指针指向字符串常量
char* str6 = str1; // 使用字符指针指向字符数组

在处理字符串时,应当注意字符串的长度和内存空间的管理,避免造成缓冲区溢出等安全问题。如果需要对字符串进行多次操作,并且需要动态分配内存、自动管理长度等功能,推荐使用C++标准库提供的 string 类型。

关注我,不迷路,共学习,同进步

关注我,不迷路,同学习,同进步

C++学习之基本数据类型_学习_02