算术类型
算术类型分为两类
- 整型(integral type),包括字符和布尔型在内
- 浮点型
算术类型的尺寸(该类型数据所占的比特数)在不同机器上有所差别,C++ 标准规定了尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。某一类型所占的比特数不同,他所能表示的数据范围也不同。
类型 | 含义 | 最小尺寸 | 说明 |
---|---|---|---|
bool | 布尔类型 | 未定义 | 取值为真(true)或假(false) |
char | 字符 | 8 位 | 一个 char 的空间应确保可以存放机器基本字符集中任意字符对应的数字值 |
wchar_t | 宽字符 | 16 位 | 用于扩展字符集,确保可以存放机器最大扩展字符集中的任意一个字符 |
char16_t | Unicode字符 | 16 位 | 用于扩展字符集,为 Unicode 字符集服务 |
char32_t | Unicode 字符 | 32 位 | 用于扩展字符集,为 Unicode 字符集服务 |
short | 短整型 | 16 位 | 无 |
int | 整型 | 16位 | 一个 int 至少和 一个 short 一样大 |
long | 长整型 | 32 位 | 一个 long 至少和一个 int 一样大 |
long long | 长长整型 | 64 位 | C++11 中新定义,一个 long long 至少和 一个 long 一样大 |
float | 单精度浮点数 | 6 位有效数字 | 无 |
double | 双精度浮点数 | 10 位有效数字 | 无 |
long double | 扩展精度浮点数 | 10 位有效数字 | 常常用于有特殊浮点需求的硬件 |
其他说明
除字符和布尔类型之外,其他整型用于表示(可能)不同尺寸的整数
C++标准指定了一个浮点数有效位数的最小值,然而大多数编译器都实现了更高的精度
在VS2017中测试各类型的大小
sizeof(bool) 1
sizeof(char) 1
sizeof(wchar_t) 2
sizeof(char16_t) 2
sizeof(char32_t) 4
sizeof(short) 2
sizeof(int) 4
sizeof(long) 4
sizeof(long long) 8
sizeof(float) 4
sizeof(double) 8
sizeof(long double) 8
各类型取值范围
C++标准规定:
一个浮点数的有效位数的最小值,但是大多数的编译器都实现了更高的精度。通常:float以1个字(32比特)来表示,double以2个字(64比特)来表示,long double用以3或者4个字(96或者128比特)来表示一般来说float类型和double类型分别有7 和16位有效数字。了诶性long double常常用于有特殊浮点要求的硬件。它的具体实现不同,精度也各不相同。
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main()
{
printf("char类型的变量存储值从%d到%d\n", CHAR_MIN, CHAR_MAX);
printf("unsigned char类型的变量存储值从0到%u\n", UCHAR_MAX);
printf("short类型的变量存储值从%d到%d\n", SHRT_MIN, SHRT_MAX);
printf("unsigned short类型的变量存储值从0到%u\n", USHRT_MAX);
printf("int类型的变量存储值从%d到%d\n", INT_MIN, INT_MAX);
printf("unsigned int类型的变量存储值从0到%u\n", UINT_MAX);
printf("long类型的变量存储值从%ld到%ld\n", LONG_MIN, LONG_MAX);
printf("unsigned long类型的变量存储值从0到%lu\n\n", ULONG_MAX);
printf("long long类型的变量存储值从%lld到%lld\n", LLONG_MIN, LLONG_MAX);
printf("unsigned long long类型的变量存储值从0到%llu\n", ULLONG_MAX);
printf("最小的非零float类型变量的值的是%.3e\n", FLT_MIN);
printf("最大的float类型变量的值的是%.3e\n", FLT_MAX);
printf("最小的非零double类型变量的值的是%.3e\n", DBL_MIN);
printf("最大的double类型变量的值的是%.3e\n\n", DBL_MAX);
printf("最小的非零long double类型变量的值的是%.3Le\n", LDBL_MIN);
printf("最大的long double类型变量的值的是%.3Le\n", LDBL_MAX);
printf("float类型的变量提供%u位精度的小数位数\n", FLT_DIG);
printf("double类型的变量提供%u位精度的小数位数\n\n", DBL_DIG);
printf("long double类型的变量提供%u位精度的小数位数\n", LDBL_DIG);
}
字面值常量
面值常量(literal),每个字面值常量都对应一种数据类型,其形式和值决定了它的数据类型。
整型字面值
整型字面值可以写作十进制数、八进制数、十六进制数的形式。下边表格展示了如何用上面的三种进制表示数值 20
进制 | 示例 | 说明 | 默认类型 | 无/带符号 |
---|---|---|---|---|
十进制 | 20 | 无 | int, long, long long 中的尺寸最小的能容纳下的 | 带符号数 |
八进制 | 024 | 以 0 开头的整数 | int, long, long long 与它们相对应的 unsigned 类型 | 两者皆有 |
十六进制 | 0x14 | 以 0x 或 0X 开头的整数 | int, long, long long 与它们相对应的 unsigned 类型 | 两者皆有 |
如果一个字面值连与之关联的最大的数据类型都放不下,将产生错误。类型 short 没有对应的字面值。
浮点型字面值
浮点型字面值表现为一个小数或以科学技术法表示的指数,其中指数用 E 或 e 标识:
3.14159
3.14159E0
0.
0e0
.001
默认的,浮点型字面值是一个 double
字符和字符串字面值
由单引号括起来的一个字符称为 char 型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。
'a' //字符字面值
"Hello" //字符串字面值
转义序列
有两类字符程序员不能直接使用
不可打印(nonprintable)的字符,如退格或其他控制字符,因为它们没有可视的图符
在 C++ 中有特殊含义的字符(单引号,双引号,问号,反斜线),在这种情况下需要用到转义序列(escape sequence)
转义序列均以反斜线作为开始,C++ 语言规定的转义序列包括:
字符 | 转义序列 |
---|---|
换行符 | \n |
横向制表符 | \t |
纵向制表符 | \v |
反斜线 | \ |
回车符 | \r |
退格符 | \b |
问号 | ? |
双引号 | " |
单引号 | \’ |
进纸符 | \f |
报警(响铃)符 | \a |
指定字面值的类型
如下表中所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型
字符串和字符串字面值
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode 16 字符 | char16_t |
U | Unicode 32 字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面值常量) | char |
整型字面值
后缀 | 最小匹配类型 |
---|---|
u or U | unsigned |
l or L | long |
ll or LL | long long |
浮点型字面值
后缀 | 类型 |
---|---|
f or F | float |
l or L | long double |
wchar_t w = L'a';
std::string s = u8"hi";
unsigned long long ull = 42ULL;
float f = 1E-3F;
long double ld = 3.14159L;
布尔字面值和指针字面值
true 和 false 是布尔类型的字面值
nullptr 是指针字面值(C++ 11 新标准,最好使用这个,而避免使用 NULL)