|
| 1 | +# 基本数据类型 |
| 2 | + |
| 3 | +在 C++ 中,数据类型(Data Type)是⼀种属性,它告诉编译器如何解释存储在计算机内存中的⼀段数据。数据类型决定了数据的存储⼤⼩、布局、值范围以及可以对该数据执⾏哪些操作。 |
| 4 | + |
| 5 | +C++ 提供了多种数据类型,包括基本数据类型、复合数据类型和特殊数据类型,本篇主要讲解的是 C++ 的基本数据类型。 |
| 6 | + |
| 7 | +C++ 的基本数据类型分为 "五类",分别是`整数型`、`浮点型`、`字符型`、`布尔型`、`空类型`。它们在各自对应的应用场景中都有着不可或缺的重要性,接下来对这些数据类型进行逐步的学习。 |
| 8 | + |
| 9 | +### 整数型 |
| 10 | + |
| 11 | +整数型可以理解为在内存中开辟一个专门用于存储数字的空间,根据要存放的数字大小可以采用不同的整数型关键字来开辟所需大小的空间。 |
| 12 | + |
| 13 | +在整数类型中有四位管理员它们分别管理着自己的空间大小它们分别是: `short`、`int`、`long`、`long long`,接下来使用表格来直观的查看它们的区别。 |
| 14 | + |
| 15 | +| 类型 | (通常)占用大小(字节) | 范围 | 备注 | |
| 16 | +| ----------- | -------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------- | |
| 17 | +| `short` | 2 | `-32,768` 到 `32,767` | | |
| 18 | +| `int` | 4 | `-2,147,483,648` 到 `2,147,483,647` | 标准只保证至少有16位,但现代系统上通常是32位。 | |
| 19 | +| `long` | **4 或 8** | 依赖于系统和编译器 | 至少为32位。在32位系统和64位Windows上通常为4字节;在64位Linux/macOS上通常为8字节。 | |
| 20 | +| `long long` | 8 | `-9,223,372,036,854,775,808` 到 `9,223,372,036,854,775,807` | 标准保证至少有64位。 | |
| 21 | + |
| 22 | +```{note} |
| 23 | +在上方的表格中可以直观的看到这些类型所能够管理的最大和最小的空间,如果使用例如 `short` 来管理超过它所能够管理范围的整数数据那么这份数据就会损坏出错。 |
| 24 | +``` |
| 25 | + |
| 26 | +```{admonition} 举个栗子 🌰 |
| 27 | +:class: note |
| 28 | +
|
| 29 | +尝试使用 `short` 类型存储正整数超过 `32,767` 的数据,例如: `32,768`. |
| 30 | +``` |
| 31 | + |
| 32 | +```{admonition} 👨💻 代码演示 |
| 33 | +
|
| 34 | +```CPP |
| 35 | +#include <iostream> |
| 36 | +
|
| 37 | +int main() |
| 38 | +{ |
| 39 | + short i = 32768; |
| 40 | +
|
| 41 | + std::cout<< i; |
| 42 | +
|
| 43 | + return 0; |
| 44 | +} |
| 45 | +``` |
| 46 | + |
| 47 | +当你运行上方代码的时候你会发现编译器并不会报错! |
| 48 | + |
| 49 | +**你**: 欸? 难道可以存储吗? |
| 50 | + |
| 51 | +**系统**: 当然不可以,你仔细看一看输出的内容吧。 |
| 52 | + |
| 53 | +**输出结果**: `-32768` |
| 54 | + |
| 55 | +这是因为当你试图将一个超出范围的值存入一个变量时,就会发生溢出。 |
| 56 | + |
| 57 | +```{important} |
| 58 | +注意整数型的数据类型只能够用来存储整数,如果用来存储例如: `3.1415` 或 `a` 这种数据则同样会出现错误!!! |
| 59 | +``` |
| 60 | + |
| 61 | +### 浮点型 |
| 62 | + |
| 63 | +对于一些需要存储小数的场景下我们需要使用浮点数据类型来存储小数,浮点型有三位管理员分别是: `float`、`double`、`long double`。 |
| 64 | + |
| 65 | +| 类型 | (通常)占用大小(字节) | 范围 | |
| 66 | +| ------------- | -------------------- | ---------------------------------------------------- | |
| 67 | +| `float` | 4 | 约 6-7 位十进制小数精度 | |
| 68 | +| `double` | 8 | 约 15-16 位十进制小数精度 | |
| 69 | +| `long double` | 8, 12, 或 16 | 提供比 `double` 更高的精度,具体大小和精度依赖于环境 | |
| 70 | + |
| 71 | +```{admonition} 👨💻 代码演示 |
| 72 | +
|
| 73 | +```CPP |
| 74 | +#include <iostream> |
| 75 | +
|
| 76 | +int main() { |
| 77 | + float myFloat = 3.14; |
| 78 | + double myDouble = 3.14159; |
| 79 | + long double myLongDouble = 3.1415926535; |
| 80 | + |
| 81 | + std::cout << "单精度浮点数: " << myFloat << std::endl; |
| 82 | + std::cout << "双精度浮点数: " << myDouble << std::endl; |
| 83 | + std::cout << "长双精度浮点数: " << myLongDouble << std::endl; |
| 84 | + |
| 85 | + return 0; |
| 86 | +} |
| 87 | +
|
| 88 | +``` |
| 89 | + |
| 90 | +```{important} |
| 91 | +浮点类型可以表⽰⾮常⼤或⾮常⼩的数,但它们只能近似地表⽰⼩数,因为它们在内存中的表⽰是基于⼆进制分数的。 |
| 92 | +
|
| 93 | +浮点类型在计算机中的表示有时会导致出现精度问题,因此在需要进行精确计算的场景(如金融计算)中,应该考虑使用专门的库而不是浮点类型。 |
| 94 | +``` |
| 95 | + |
| 96 | +### 字符型 |
| 97 | + |
| 98 | +字符型是一个用于存储各种文本字符的数据类型例如: `1234567890` 或 `abcdefghijklmnopqrstuvwxyz` 又或者是大写的 `ABCDEFGHIJKLMNOPQRSTUVWXYZ`,这些字符都可以使用此数据类型进行存储。 |
| 99 | + |
| 100 | +| 类型 | (通常)占用大小(字节) | 范围 | |
| 101 | +| --------- | -------------------- | ------------------------------------------------------ | |
| 102 | +| `char` | 1 | 用于存储单个ASCII字符,或 `-128` 到 `127` 范围的小整数 | |
| 103 | +| `wchar_t` | 2 或 4 | 宽字符类型,用于支持多语言字符集(如Unicode) | |
| 104 | + |
| 105 | +`char` 数据类型通常只能用来存储一个字符 也就是 "1" / "A" 这种单个的字符,如果想要存储一句话这种长字符就需要用到**数组**来实现。 |
| 106 | + |
| 107 | +`wchar_t` 能够存储的不仅限于普通的文本,它还可以用来存储一些特殊的符号例如 `©` 符号。 |
| 108 | + |
| 109 | + |
| 110 | +```{admonition} 👨💻 代码演示 |
| 111 | +
|
| 112 | +```CPP |
| 113 | +#include <iostream> |
| 114 | +
|
| 115 | +int main() { |
| 116 | + char character = 'A'; |
| 117 | + wchar_t wideChar = L'Ω'; |
| 118 | + |
| 119 | + std::cout << "字符: " << character << std::endl; |
| 120 | + std::cout << "字符的ASCII值: " << int(character) << std::endl; |
| 121 | + |
| 122 | + return 0; |
| 123 | +} |
| 124 | +``` |
| 125 | + |
| 126 | +### 布尔型 |
| 127 | + |
| 128 | +布尔型也可以称之为逻辑型,这个数据类型只有一个类型名 `bool`,它只能存储 "`true`" / "`false`" 两个值。布尔型常用于需要进行逻辑判断的场景,例如校验是否正确 `true`(正确) 或 `false`(不正确)。 |
| 129 | + |
| 130 | +| 类型 | (通常)占用大小(字节) | 范围 | |
| 131 | +| ------ | -------------------- | ------------------------------- | |
| 132 | +| `bool` | 1 | 只能是 `true` 或 `false` 两个值 | |
| 133 | + |
| 134 | +```{admonition} 👨💻 代码演示 |
| 135 | +
|
| 136 | +```CPP |
| 137 | +#include <iostream> |
| 138 | +
|
| 139 | +int main() { |
| 140 | + bool isTrue = true; |
| 141 | + bool isFalse = false; |
| 142 | + |
| 143 | + std::cout << "isTrue: " << isTrue << std::endl; |
| 144 | + std::cout << "isFalse: " << isFalse << std::endl; |
| 145 | + std::cout << "isTrue的实际值: " << (isTrue ? "true" : "false") << std::endl; |
| 146 | + |
| 147 | + return 0; |
| 148 | +} |
| 149 | +``` |
| 150 | + |
| 151 | +### 空类型 |
| 152 | + |
| 153 | +空类型代表着没有类型,使用场景通常是表示函数没有返回值或者函数不需要接收参数。 |
| 154 | + |
| 155 | +| 类型 | (通常)占用大小(字节) | 范围 | |
| 156 | +| ------ | -------------------- | -------------------------------------------------- | |
| 157 | +| `void` | 不适用 | 表示“无类型”,常用于函数返回类型或泛型指针 `void*` | |
| 158 | + |
| 159 | +```{admonition} 👨💻 代码演示 |
| 160 | +
|
| 161 | +```CPP |
| 162 | +void demo(void){ |
| 163 | + std::cout << "我不接收任何参数 也不返回任何值" << std::endl; |
| 164 | +} |
| 165 | +``` |
0 commit comments