大话C++:第3篇 C++数据类型

1 C++数据类型分类

C++ 提供了多种数据类型,常见的数据类型分类:

  • 基本数据类型

    • 整数类型:包括 intshortlonglong long。这些类型用于存储整数值。

    • 浮点数类型:包括 floatdouble。这些类型用于存储浮点数值。

    • 字符类型:char,用于存储单个字符。

    • 布尔类型:bool,只有两个值:truefalse

  • 复合数据类型

    • 数组:用于存储相同类型的多个元素。

    • 字符串(String):用于存储文本。

    • 结构体(struct):能够自定义存储不同类型的数据结构。

    • 枚举(enum):用于定义一组命名的常量。

    • 联合体(union):用于在相同的内存位置存储不同的数据类型。

  • 指针类型

    • 指针:用于存储变量的内存地址。

    • 引用:用于别名,可以用作变量的别名。

  • 高级数据类型

    • 类(class):用于创建自定义的面向对象数据类型。

    • 枚举类(enum class):用于创建具有作用域的枚举。

  • 指定长度整数类型:用于确保特定长度的整数类型,例如,int32_tuint64_t

2 指定长度数据类型

在C++中,指定长度数据类型通常指的是为某些基础数据类型明确指定其占用的字节数或位数。这通常是为了确保跨平台或跨编译器的一致性,因为不同的系统或编译器可能会对基础数据类型的默认大小有所不同。

例如,在C++中,int类型的大小通常是32位(4字节),但在某些64位系统中,为了向前兼容,编译器可能会将其编译为64位。此外,long类型的大小也可能因编译器和平台而异,有时为32位,有时为64位。

为了解决这个问题,C++标准库提供了固定宽度的整数类型,这些类型在<cstdint>头文件中定义。这些类型包括int8_tint16_tint32_tint64_t等对于有符号整数,以及uint8_tuint16_tuint32_tuint64_t等对于无符号整数。这些类型分别表示8位、16位、32位和64位的整数,且不受编译器或平台的影响。

C++指定长度数据类型定义在<cstdint>头文件中,如下表所示:

数据类型描述位数字节取值范围
int8_t有符号8位整数81-128 到 127
uint8_t无符号8位整数810 到 255
int16_t有符号16位整数162-32,768 到 32,767
uint16_t无符号16位整数1620 到 65,535
int32_t有符号32位整数324-2,147,483,648 到 2,147,483,647
uint32_t无符号32位整数3240 到 4,294,967,295
int64_t有符号64位整数648-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
uint64_t无符号64位整数6480 到 18,446,744,073,709,551,615

此外,C++还提供了固定宽度的浮点类型:

数据类型描述位数字节取值范围(近似)
_Float32单精度浮点数324±1.2E-38 到 ±3.4E+38
_Float64双精度浮点数648±2.3E-308 到 ±1.8E+308

在C++中,可以使用<climits>头文件中定义的常量来获取这些极限值。

#include <climits>
#include <iostream>

int main()
{
    // 指定长度的数据类型
    std::cout << "int长度=" << sizeof(int) << std::endl;
    std::cout << "int32_t长度=" << sizeof(int32_t) << std::endl;
    std::cout << "long长度=" << sizeof(long) << std::endl;
    std::cout << "long long长度=" << sizeof(long long) << std::endl;
    std::cout << "int64_t长度=" << sizeof(int64_t) << std::endl;
    
    // 有符号整数类型的最大值和最小值
    std::cout << "int8_t 最小值: " << INT8_MIN << ", 最大值: " << INT8_MAX << std::endl;
    std::cout << "int16_t 最小值: " << INT16_MIN << ", 最大值: " << INT16_MAX << std::endl;
    std::cout << "int32_t 最小值: " << INT32_MIN << ", 最大值: " << INT32_MAX << std::endl;
    std::cout << "int64_t 最小值: " << INT64_MIN << ", 最大值: " << INT64_MAX << std::endl;

    // 无符号整数类型的最大值(无符号类型没有最小值,因为它们不能为负)
    std::cout << "uint8_t 最大值: " << UINT8_MAX << std::endl;
    std::cout << "uint16_t 最大值: " << UINT16_MAX << std::endl;
    std::cout << "uint32_t 最大值: " << UINT32_MAX << std::endl;
    std::cout << "uint64_t 最大值: " << UINT64_MAX << std::endl;

    return 0;
}

 对于浮点数类型_Float32_Float64,可以使用<cfloat>头文件中定义的常量来获取极限值:

#include <cfloat>
#include <iostream>

int main() 
{
    // 指定长度的浮点数据类型
    std::cout << "float32_t长度=" << sizeof(_Float32) << std::endl;
    std::cout << "float长度=" << sizeof(float) << std::endl;
    std::cout << "float64_t长度=" << sizeof(_Float64) << std::endl;
    std::cout << "double长度=" << sizeof(double) << std::endl;
    
    // 单精度浮点数的最大值、最小正数、最小值(负无穷大)
    std::cout << "float32_t 最大值: " << FLT_MAX << std::endl;
    std::cout << "float32_t 最小正数: " << FLT_MIN << std::endl;
    std::cout << "float32_t 最小值: " << -FLT_MAX << std::endl;

    // 双精度浮点数的最大值、最小正数、最小值(负无穷大)
    std::cout << "float64_t 最大值: " << DBL_MAX << std::endl;
    std::cout << "float64_t 最小正数: " << DBL_MIN << std::endl;
    std::cout << "float64_t 最小值: " << -DBL_MAX << std::endl;

    return 0;
}

3 基本数据类型

数据类型取值范围字节数最大值最小值
booltrue/false1
char-128 到 1271127-128
signed char-128 到 1271127-128
unsigned char0 到 25512550
short-32,768 到 32,767232,767-32,768
unsigned short0 到 65,535265,5350
int-2,147,483,648 到 2,147,483,64742,147,483,647-2,147,483,648
unsigned int0 到 4,294,967,29544,294,967,2950
long取决于平台4 或 8取决于平台取决于平台
unsigned long取决于平台4 或 8取决于平台取决于平台
long long-9,223,372,036,854,775,808 到 9,223,372,036,854,775,80789,223,372,036,854,775,807-9,223,372,036,854,775,808
unsigned long long0 到 18,446,744,073,709,551,615818,446,744,073,709,551,6150
float约 ±3.4e±38 (7 有效数字)4约 3.4e+38约 -3.4e+38
double约 ±1.8e±308 (15 有效数字)8约 1.8e+308约 -1.8e+308

注意longunsigned long 的取值范围和字节数可能会根据平台和编译器而有所不同。在某些32位系统上,它们可能是4字节,而在64位系统上可能是8字节。

#include <iostream>

int main() 
{
    // 整型数据
    int intVar = 10;    			// 有符号整型
    unsigned int uintVar = 20; 		// 无符号整型
    long longVar = 30L; 			// 长整型,注意L后缀
    unsigned long ulongVar = 40UL; 	// 无符号长整型,注意UL后缀
    short shortVar = 50; 			// 短整型
    unsigned short ushortVar = 60; 	// 无符号短整型

    // 浮点型数据
    float floatVar = 1.23f; 		// 单精度浮点型,注意f后缀
    double doubleVar = 2.46; 		// 双精度浮点型
    long double ldoubleVar = 3.69L; // 扩展精度浮点型,注意L后缀

    // 字符型数据
    char charVar1 = 'A'; 			// 字符型(单个字符)
    char charVar2 = 65;  			// 字符型(ASCII码值)

    // 布尔型数据
    bool boolVar = true; 			// 布尔型

    // 输出变量值
    std::cout << "intVar: " << intVar << std::endl;
    std::cout << "uintVar: " << uintVar << std::endl;
    std::cout << "longVar: " << longVar << std::endl;
    std::cout << "ulongVar: " << ulongVar << std::endl;
    std::cout << "shortVar: " << shortVar << std::endl;
    std::cout << "ushortVar: " << ushortVar << std::endl;
    std::cout << "floatVar: " << floatVar << std::endl;
    std::cout << "doubleVar: " << doubleVar << std::endl;
    std::cout << "ldoubleVar: " << ldoubleVar << std::endl;
    std::cout << "charVar1: " << charVar1 << std::endl;
    std::cout << "charVar2 (ASCII): " << charVar2 << std::endl;
    std::cout << "boolVar: " << boolVar << std::endl;

    return 0;
}

在C++中,可以使用标准库提供的常量来获取基本数据类型的最大值和最小值。这些常量通常在<climits>(对于字符和整数类型)和<cfloat><cfloatingpoint>(对于浮点类型)头文件中定义。

#include <iostream>
#include <climits> 
#include <cfloat>

int main() 
{
    // 整数类型的最大值和最小值
    std::cout << "Int 最大值: " << INT_MAX << std::endl;
    std::cout << "Int 最小值: " << INT_MIN << std::endl;
    std::cout << "Short 最大值: " << SHRT_MAX << std::endl;
    std::cout << "Short 最小值: " << SHRT_MIN << std::endl;
    std::cout << "Long 最大值: " << LONG_MAX << std::endl;
    std::cout << "Long 最小值: " << LONG_MIN << std::endl;
    std::cout << "Long long 最大值: " << LLONG_MAX << std::endl;
    std::cout << "Long long 最小值: " << LLONG_MIN << std::endl;
    std::cout << "Unsigned int 最大值: " << UINT_MAX << std::endl;
    std::cout << "Unsigned long 最大值: " << ULONG_MAX << std::endl;
    std::cout << "Unsigned long long 最大值: " << ULLONG_MAX << std::endl;

    // 浮点类型的最大值、最小正数、最小值(负无穷大)
    std::cout << "Float 最大值: " << FLT_MAX << std::endl;
    std::cout << "Float 最小正数: " << FLT_MIN << std::endl;
    std::cout << "Float 最小值: " << -FLT_MAX << std::endl;
    std::cout << "Double 最大值: " << DBL_MAX << std::endl;
    std::cout << "Double 最小正数: " << DBL_MIN << std::endl;
    std::cout << "Double 最小值: " << DBL_MAX << std::endl;
    std::cout << "Long double 最大值: " << LDBL_MAX << std::endl;
    std::cout << "Long double 最小正数: " << LDBL_MIN << std::endl;
    std::cout << "Long double 最小值: " << -LDBL_MAX << std::endl;

    return 0;
}

4 宽字符类型

在C++中,宽字符(wide character)和宽字符字符串(wide character string)主要用于支持多种语言,特别是那些无法仅使用单字节字符集(如ASCII)表示的语言。宽字符使用更多的字节来表示一个字符,通常是2个或4个字节,这取决于具体的实现。在大多数现代系统上,宽字符通常是16位。

4.1 宽字符变量定义

C++中的宽字符变量的定义使用wchar_t数据类型表示,语法格式

wchar_t 变量名 = 宽字符字面量;

其中,宽字符字面量是以 Ll(通常是大写)开头的字符。

#include <iostream>

int main() 
{
    // 定义一个宽字符变量,并用宽字符字面量初始化
    wchar_t wideVar = L'你';

    // 使用 wcout 输出宽字符
    std::wcout << L"宽字符示例: " << wideVar << std::endl;

    return 0;
}

4.2 宽字符数组定义

宽字符数组是用来存储多个宽字符的数组。宽字符数组的语法格式与普通的字符数组非常相似。可以声明一个固定大小的宽字符数组,并使用花括号进行初始化,或者直接声明一个未初始化的数组。语法格式

// 方式1:定义固定大小宽字符数组,并初始化
// 其中,数组长度可选
wchar_t 数组名[数组长度] = {初始化宽字符};

// 方式2:定义固定大小宽字符数组,但不初始化
wchar_t 数组名[数组长度];

代码示例:

#include <iostream>

int main() 
{
    // 定义一个宽字符数组并初始化
    wchar_t wideArray[] = {L'你', L'好', L'世', L'界'};

    // 使用 wcout 输出宽字符数组
    for (int index = 0; index < sizeof(wideArray) / sizeof(wchar_t); ++index)
    {
        std::wcout << wideArray[index];
    }
    std::wcout << std::endl;

    return 0;
}

4.3 宽字符串

宽字符串是由宽字符组成的字符串。在C++中,宽字符串以 L 前缀开头,每个字符都是 wchar_t 类型。宽字符串的声明语法格式通常与普通字符串相似,存在两种声明语法格式

// 方式1:声明一个宽字符串常量
wchar_t 数组名[数组长度] = L"宽字符串内容";

// 方式2:按照宽字符数组声明,数组以L'0'结尾
wchar_t 数组名[数组长度] = {初始化宽字符,以L'0'结尾};

其中,对于方式2而言,初始化了一个宽字符串数组,数组的大小由初始化的字符串长度自动确定,并包括结尾的空字符(L'\0')。

#include <iostream>

int main() 
{
    // 声明并初始化一个宽字符串变量
    wchar_t wideString1[] = L"你好,世界!";

    // 使用宽字符输出流输出宽字符串
    std::wcout << wideString1 << std::endl;

    // 声明一个足够大的宽字符数组来存储宽字符串
    wchar_t wideString2[] = {L'你', L'好', L'世', L'界', L'\0'};;

    // 使用宽字符输出流输出宽字符串
    std::wcout  << wideString2 << std::endl;

    return 0;
}

注意

  • 宽字符串字面量必须以 L 前缀开始,以表明它是宽字符串而不是普通字符串。

  • 宽字符串通常以空宽字符(L'\0')结尾,以标记字符串的结束。

  • 声明宽字符串变量时,需要确保数组的大小足够大,以容纳字符串中的所有字符,包括结尾的空字符。如果字符串字面量的长度超过了数组的大小,将会导致缓冲区溢出,这是一种常见的安全漏洞。

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值