C++ fundamental types

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 charchar不一定是有符号的,由不同的编译器来决定。

其他注意事项:

  1. 算术表达式中不要使用char,因为不同的编译器对char的处理方式可能不同,一些把char当做有符号的,一些把char当做无符号的,在不同机器之间进行迁移时可能会出现问题。
  2. 浮点数运算用doublefloat精度不够,而且计算代价和double差不多。

类型转换

在程序的某处使用一种类型而其实对象应该使用另外一种类型时,程序会自动进行类型转换。关于类型转换的更多内容可以查看C++ type conversions

  1. 在将有符号数转化为无符号数的时候,如果这个有符号数是负数,那么会做一个模运算,将它转换为正值。
  2. 无符号数永远不可能为负。
  3. 如果一个运算同时有有符号数和无符号数参与运算,那么会将有符号数转换为无符号数进行运算。如下示例:
1
2
3
4
5
6
7
8
int a = -3;
unsigned int b = 0;
b--;
std::cout << b << std::endl;
//output: 4294967295
b = a;
std::cout << b << std::endl;
//output: 4294967293

字面值常量

字面值(literal)是字面值常量的缩写,它的值是一看就知道的量,并且不允许改变。每一个字面值常量都对应一种数据类型,可以是整形,浮点型,字符,字符串,转义序列,布尔和指针等,数据类型由它的形式和值决定。可以通过前缀或者后缀显式的指定字面值的类型,字符和字符串的字面值类型通过前缀指定,整形和浮点型的字面值类型通过后缀指定。
前缀

  • u,表示unicode 16字符
  • U,表示unicode 32字符
  • L,表示宽字符
  • u8utf-8,只用于字符串字面值常量

后缀,这里给出的最小匹配类型,如果不够的话,会自动选择更大的。

  • u,Uunsigned
  • l, L, long
  • ll, LL, long long
  • f, F, float
  • l, L, long double

整形字面值常量

12,1345等。
十进制的字面值常量是带符号数,比如12int, long, long long中能容纳下的占用最小字节的类型;八进制和十六进制的字面值常量是能容纳其数值的int, long, long long, unsigned int, unsigned long, unsigned long中的最小类型。

浮点型字面值常量

浮点型的字面值常量是double

字符和字符串字面值常量

'a'是字面值字符常量,"hello world"是字符串字面值常量。

转义序列

包含不可打印和可打印的字符。\n,\r,\t,\b,\a等。

布尔字面值

true, falsebool变量的字面值。

指针字面值

nullptr是指针字面值。

参考文献

1.《C++ Primer第五版》
2.https://www.cnblogs.com/yc_sunniwell/archive/2010/06/18/1760034.html