算数类型主要分为两大类:整形(包括字符和布尔类型)和浮点型。
布尔类型(bool)的取值是真(ture)或者假(false)。 字符类型:基础的字符类型是char,扩展如wchar_t、char16_t、char32_t等。 整型类型:short、int、long、long long等。其中一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。具体数据大小与硬件相关。 浮点类型:单精度、双精度和扩展精度。一般float占1Byte,double占2Byte,long double占3-4Byte。通常float和double分别有7和16个有效位,long double有效位与硬件有关。 带符号类型和无符号类型:除布尔类型和扩展类型外,其他整形可以划分为带符号(signed)和无符号(unsigned)两种。带符号可表示正数、负数和零,无符号只能表示正数和零。int、short、long、long long都是带符号类型,通过增加unsigned可得到无符号类型。另外,单独的unsigned为unsigned int的缩写。此外比较特殊的是char类型,与其他整型不同,char类型与signed char并不一定是一致的。实际上signed char和unsigned char是固定的,但char的类型随编译器决定,表现为前两种形式的一种。
常规的类型选择: 1、明确数值不可能为负时,使用无符号类型。 2、使用int进行整数运算。在算数表达式中不要使用char或bool,只有在存放字符或布尔值时才使用它们。若必须使用char时,应明确指出它的类型是signed char或unsigned char。 3、执行浮点运算时使用double,因为float通常精度不够并且二者计算代价相差无几。
整型字面值可写作十进制、八进制和十六进制的形式。以0开头的整数代表八进制,以0x或0X开头的代表十六进制。
20 /*十进制*/ 024 /*八进制*/ 0x14 /*十六进制*/以上为十进制20的三种表示方法。
整型字面值具体的数据类型由它的值和符号决定。默认情况下,十进制字面值是带符号的,八进制和十六进制字面值既可能是带符号的也可能是无符号的。十进制字面值的类型是int、long、long long中能容下当前值的最小的那个。同理,八进制和十六进制字面值的类型是int、unsigned int、long、unsigned long、long long、unsigned long long中能容下当前值的最小的那个。另外,short没有对应的字面值。 尽管整型字面值可以存储在带符号数据类型中,但严格来讲,字面值不会是负数,仅仅是对字面值取负值而已。
浮点型字面值表现为小数或以科学计数法表示的指数,其中指数部分用E或e标识。
3.14159 /*小数*/ 3.14159E0 /*科学计数法*/以上为3.14159的两种表示方法。 默认情况下,浮点型字面值类型是double。
字符字面值是由单引号括起来的一个字符,一般称为char型字面值。
字符串字面值是由双引号括起来零个或多个字符,则为字符串型字面值。字符串字面值的类型实际上是由字符常量组成的数组,并且编译器会在结尾处添加一个空字符‘\0’,因此,字符串字面值的实际长度要比它的内容多1。另外,如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一个整体。
转义序列 在程序中,不可打印的字符和有特殊含义的字符都不能直接使用,需要通过转义序列来表示。 常用转义:
\n /*换行符*/ \t /*横向制表符*/ \v /*纵向制表符*/ \b /*退格*/ \r /*回车符*/ \\ /*反斜杠*/ \" /*双引号*/ \' /*单引号*/泛用转义: \接3位数表示8进制数,如:\888 \x接2位数表示16进制数,如:\x16 这两种形式一般用于表示特殊字符集中的对应字符。如:Latin-1字符集中\115和\x4d均表示字符M。
指定字面值类型 通过增加前缀或后缀可以改变整型、浮点型和字符型字面值的默认类型。 前缀(字符及字符串): u-char16_t(Unicode16字符) U-char32_t(Unicode32字符) L-wchar_t(宽字符) u8-char(UTF-8仅用于字符串字面常量) 例:
u8"hello!" L'A'后缀(整型及浮点): u or U-unsigned l or L-long ll or LL-long long f or F-float l or L-long double 对整型字面值来说指定类型可以组合使用,如UL。 例:
42ULL 1E-3F 3.14159L布尔类型字面值:ture 和false
指针字面值:nullptr