C++变量类型的那些事
同样的变量类型名在不同的机器 下的含义不一定相同,下表C++标准规定的变量所对应的的最小尺寸。
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 长整型 | 32位 |
long long | 长整型 | 64位 |
float | 单精度浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10位有效数字 |
long double | 扩展精度浮点型 | 10位有效数字 |
有些类型分为带符号的(signed)和无符号的(unsigned)两种。一般情况下,缺省符号都是signed,如int,short,long等都是有符号的,值得一提的是,与其他整形不同,字符型char和signed char并不一样。char具体是signed还是unsigned由编译器决定。
如何选择类型
这儿提几点建议:
- 如果你需要一个不大的整数,可有明确地指定他的类型是signed char或者是unsigned char。
- 执行浮点数运算时选用double,引文float通常精度不够而且双精度和单精度的计算代价相差无几。事实上,对于某些机器来说,双精度运算甚至更快一些。long double提供的精度在一般情况下是没有必要的,而且带来的时耗也不容忽视。
类型转换
- 当我们把一个整数值赋给浮点数类型时,小数部分记为0。如果该整形所占的空间超过了浮点数的容量,精度可能会丢失。
- 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值取模后的余数。
- 当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。此时,程序可能继续工作,可能崩溃,也可能生成垃圾数据。
写程序时一定要考虑程序的可移植性,例如在不同的平台上int的长度是不一样的,如果我们把int的尺寸看成是一个确定不变的已知值,那么这样的程序就是不可移植的(nonportable)。
字面值常量
一个形如42的值被称作位字面值常量(literal),这样的值一望而知。每个字面值常量都对应一个数据类型,字面值常量的的形式和值决定了它的数据类型。
整形和浮点型的字符常量
默认情况下,整数的十进制字面值对应的是带符号的数据类型,而八进制和十六进制则不确定。十进制的字面类型是int,long,longlong中尺寸最小的那一个,当然前提是这种类型要容纳下当前的值。而八进制则是int,unsigned int,long,unsigned long,longlong,unsigned long long 中尺寸最小者。
浮点型字面值表现为一个小数或以科学计数法表示的指数:
3.1415 3.14159E0 0. 0e0 .001
默认情况下,数据类型是double。当然可以用前缀和后缀来说明。
指定字面值的类型
前缀 | 类型 |
---|---|
u | char16_t |
U | char32_t |
L | wchar_t |
u8 | char |
整数
后缀 | 最小匹配类型 |
---|---|
u or U | unsigned |
l or L | long |
ll or LL | long long |
浮点数
后缀 | 类型 |
---|---|
f or F | float |
l or L | long double |