现代C++特性(一):基本数据类型扩展
文章目录
- 基础数据类型
- long long (C++ 11)
- numeric_limits()获取当前数据类型的最值
- warning C4309: “=”: 截断常量值
- 新字符类型char16_t和char32_t
- Windows编程常用字符类型wchar_t
- char8_t (C++ 20)
基础数据类型
C++中的基本类型是构建其他数据类型的基础,常见的基础类型包括整型,浮点型,字符型和布尔型:
- 整型:用于表示整数,如
int
、short
、long
等。 - 浮点型:用于表示带小数部分的数值,如
float
、double
等。 - 字符型:用于表示单个字符,如
char
。 - 布尔型:用于表示逻辑值,只能取
true
或false
。
类型说明符 | 等效类型 | 通常位宽 (bits) | 最小范围 (bits) | 描述 |
---|---|---|---|---|
char / signed char | char | 8 | 8 | 单个字符,至少 8 位。 |
unsigned char | unsigned char | 8 | 8 | 无符号字符,至少 8 位。 |
short / short int / signed short / signed short int | short | 16 | 16 | 短整型,至少 16 位。 |
unsigned short / unsigned short int | unsigned short | 16 | 16 | 无符号短整型,至少 16 位。 |
int / singed / signed int | int | 32 | 16 | 整型,至少 16 位,但通常为 32 位 |
unsigned / unsigned int | unsigned int | 32 | 16 | 无符号整型,至少 16 位,但通常为 32 位8。 |
long / long int /signed long /signed long int | long | 32 或 64 | 32 | 长整型,至少 32 位,具体取决于平台(例如,在 64 位系统上通常是 64 位)9。 |
unsigned long / unsigned long int | unsigned long | 32 或 64 | 32 | 无符号长整型,至少 32 位,具体取决于平台10。 |
long long / long long int | long long | 64 | 64 | 非常长的整型,至少 64 位11。 |
unsigned long long | unsigned long long | 64 | 64 | 无符号非常长的整型,至少 64 位12。 |
float | float | 32 | - | 单精度浮点数,通常为 32 位13。 |
double | double | 64 | - | 双精度浮点数,通常为 64 位14。 |
long double | long double | 平台相关 | - | 扩展精度浮点数,位宽依赖于平台(通常为 80 或 128 位)15。 |
bool | bool | 1 | - | 布尔值类型,存储 true 或 false,至少 1 位16。 |
long long (C++ 11)
C++ 11
引入标准的新类型。
无特殊声明时,声明的整数会被默认解释为int
long long x = 65536; // 实际是将int型赋给long long
long long x = 65536LL;
numeric_limits()获取当前数据类型的最值
C++中提供了获取数据类型最值的库函数 numeric_limits
,通过类模板std::numeric_limits
提供了一种标准化方法来查询算术类型的各种属性。使用示例如下:
#include <iostream>
#include <limits>int main() {std::cout << "char is " << (std::is_signed<char>::value ? "signed" : "unsigned") << " on this system." << std::endl;std::cout << "Minimum value of char: " << static_cast<int>(std::numeric_limits<char>::min()) << std::endl;std::cout << "Maximum value of char: " << static_cast<int>(std::numeric_limits<char>::max()) << std::endl;return 0;
}
//char is signed on this system.
//Minimum value of char: -128
//Maximum value of char: 127
warning C4309: “=”: 截断常量值
整型溢出问题
char buffer = 0xFF;
执行如上代码时编译器会报warning C4309: “=”: 截断常量值
因为声明的0xFF
会被解释为int
型的255
,而赋值给char
类型最大值为127
新字符类型char16_t和char32_t
UTF编码相关
char16_t utf16c = u'好';
char32_t utf32c = U'好';char16_t utf16c[] = u'你好你好';
char32_t utf32c[] = U'你好你好';
Windows编程常用字符类型wchar_t
typedef const wchar_t* LPCWSTR;
BOOL PathFileExistsW(LPCWSTR pszPath);
char8_t (C++ 20)
char str[] = u8"test"; // C++17编译通过;C++20编译失败,需要char8_t
char c = u8'c';char8_t c8a[] = "test"; //C++20编译失败,需要char
char8_t c8 = 'c';