算术类型
算术类型包括整型(integral type,包括字符和布尔类型)和浮点型。
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义 |
char | 字符 | 8bit |
wchar_t | 宽字符 | 16bit |
char16_t | Unicode 字符 | 16bit |
char32_t | Unicode字符 | 32bit |
short | 短整型 | 16bit |
int | 整型 | 16bit |
long | 长整形 | 32bit |
long long | 长整形 | 64bit |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
bool 的取值是true
(1)or false
(0)
其中char的大小与一个机器字节一样,其他字符类型用于扩展字符集。
无符号类型
可通过限定词unsigned
表示无符号类型,其中unsigned int
可以缩写为unsigned
。
例如C++中对部分类型范围的定义如下:
#define INT_MIN (-2147483647 - 1) // minimum (signed) int value
#define INT_MAX 2147483647 // maximum (signed) int value
#define UINT_MAX 0xffffffff // maximum unsigned int value
#define LONG_MIN (-2147483647L - 1) // minimum (signed) long value
#define LONG_MAX 2147483647L // maximum (signed) long value
#define ULONG_MAX 0xffffffffUL // maximum unsigned long value
类型转换
类型所能表示的值的范围决定了转换的过程:
- 把非布尔类型赋给布尔类型时,初始值为
0
则结果为false
,反之为true
。 - 把浮点数赋给整数时,进行了近似处理。结果仅保留小数点前的部分。
- 给无符号类型赋值超过其表示范围时,结果是初始值对无符号类型表示数值总数取模后的余数。例如将
-1
赋给unsigned char
后的结果是255
。 - 给符号类型赋值超出表示范围时,结果是未定义的。
含有无符号类型的表达式
当一个算术表达式中既有unsigned int
又有int
时,int
值就会被转化为无符号数(等同于将int
值赋给unsigned int
)
unsigned u = 10;
int i = -42;
std::cout<<i+i<<std::endl; //-84
std::cout<<u+i<<std::endl; //INT_MAX+u-i
切勿混用带符号类型和无符号类型
字面值常量
形如42
的值被称为字面值常量(literal),每个字面值常量都对应役种数据类型,字面值常量的形式和值决定了它的数据类型。
整型和浮点型字面值
0
开头的整数代表8进制数;
0x
或0X
开头的代表十六进制数。
例如:
20
、024
、0x14
都代表了数值20。
浮点型字面值表示为一个小树或以科学记数法表示的指数,其中指数部分用E
或e
表示:
3.14159
、3.14159E0
、0.
、0e0
、.001
。
字符和字符串字面值
单引号括起来的的一个字符称为char
型字面值,双引号括起来的则是字符串字面值
char a = 'a' //字符字面值
char s[12] = "Hello World!" //字符串字面值
字符串字面值的类型实际上是由常量字符构成的array
。
指定字面值的类型
前缀 | 类型 | 说明 |
---|---|---|
u | char16_t | Unicode16字符 |
U | char32_t | Unicode32字符 |
L | wchar_t | 宽字符 |
u8 | char | UTF-8 |
后缀 | 类型 | 说明 |
u or U | unsigned | 整型字面值 |
l or L | long | |
ll or LL | long long | |
f or F | float | 浮点型字面值 |
l or L | long Double |
例如:3.14f
= float(3.14)