C++中基本类型包括算术类型和空类型。这一节主要介绍算术类型,然后介绍了字面值常量的相关内容。
算术类型
算术类型有两类:整形和浮点型。算术类型的大小在不同的机器上实现也可能不同。
整形包括字符,布尔型,整形,长整形。
浮点类型有单精度,双精度和扩展精度浮点数,具体怎么表示可以查看IEEE 754标准。
一般情况下,char
占用$1$字节,int
占用$4$字节,long
占用$8$字节,long long
占用$8$个字节。float
占用$4$字节,double
占用$8$字节。
除了布尔型和扩展的字符型(wchar_t, char16_t, char32_t)之外,其他整形可以划分为无符号和带符号的两种,无符号类型中所有的比特位都用来存储值,而有符号类型需要使用其中的某些位存储符号。int
,long
, long long
默认是带符号的。char
可以分为三种,char
, signed char
, unsigned char
,char
不一定是有符号的,由不同的编译器来决定。
其他注意事项:
- 算术表达式中不要使用
char
,因为不同的编译器对char
的处理方式可能不同,一些把char
当做有符号的,一些把char
当做无符号的,在不同机器之间进行迁移时可能会出现问题。 - 浮点数运算用
double
,float
精度不够,而且计算代价和double
差不多。
类型转换
在程序的某处使用一种类型而其实对象应该使用另外一种类型时,程序会自动进行类型转换。关于类型转换的更多内容可以查看C++ type conversions。
- 在将有符号数转化为无符号数的时候,如果这个有符号数是负数,那么会做一个模运算,将它转换为正值。
- 无符号数永远不可能为负。
- 如果一个运算同时有有符号数和无符号数参与运算,那么会将有符号数转换为无符号数进行运算。如下示例:
1 | int a = -3; |
字面值常量
字面值(literal)是字面值常量的缩写,它的值是一看就知道的量,并且不允许改变。每一个字面值常量都对应一种数据类型,可以是整形,浮点型,字符,字符串,转义序列,布尔和指针等,数据类型由它的形式和值决定。可以通过前缀或者后缀显式的指定字面值的类型,字符和字符串的字面值类型通过前缀指定,整形和浮点型的字面值类型通过后缀指定。
前缀
u
,表示unicode 16
字符U
,表示unicode 32
字符L
,表示宽字符u8
,utf-8
,只用于字符串字面值常量
后缀,这里给出的最小匹配类型,如果不够的话,会自动选择更大的。
u,U
,unsigned
l, L
,long
ll, LL
,long long
f, F
,float
l, L
,long double
整形字面值常量
如12
,1345
等。
十进制的字面值常量是带符号数,比如12
是int
, long
, long long
中能容纳下的占用最小字节的类型;八进制和十六进制的字面值常量是能容纳其数值的int
, long
, long long
, unsigned int
, unsigned long
, unsigned long
中的最小类型。
浮点型字面值常量
浮点型的字面值常量是double
。
字符和字符串字面值常量
'a'
是字面值字符常量,"hello world"
是字符串字面值常量。
转义序列
包含不可打印和可打印的字符。\n
,\r
,\t
,\b
,\a
等。
布尔字面值
true
, false
是bool
变量的字面值。
指针字面值
nullptr
是指针字面值。
参考文献
1.《C++ Primer第五版》
2.https://www.cnblogs.com/yc_sunniwell/archive/2010/06/18/1760034.html