跳到主要内容

基本数据类型

一、void

  • 该类型用于某些特殊场合下,不对应具体的值,如函数不返回值时的返回值类型

  • void*类型,一个不指向具体类型的指针。仅能对该指针执行有限操作,包括:和别的指针比较、作为函数的输入或输出、或者赋值给另一个void*指针

    注意:C++ 中 void*类型和 C 语言中不同。在 C 语言中,void*类型可以直接隐式转换为其他任何指针类型,而在 C++ 中,void*类型到其他指针类型的转换只能显式进行

二、std::nullptr_t

  • 专用于指针字面量nullptr的类型,该类型可以隐式转换为任意指针类型,但无法隐式转换为任意非指针类型
  • 可以认为std::nullptr_t类型是对void*类型做了封装。这是一个纯右值类型,其值只会是空指针字面值nullptr
  • 在要求使用该类型名的地方应该尽量避免直接使用,而使用decltype(nullptr)的形式来代替

为什么要有std::nullptr_t类型

创建指针时有三个方法可以将该指针初始化为空指针:赋值为 0、赋值为 NULL(宏常量)、赋值为 nullptr。这三个值用来初始化指针时得到的结果完全相同。

在 C 语言中,NULL通常定义为(void*)0,但在 C++ 中,void*类型并不能隐式转换为其他指针类型,所以在 C++ 中,NULL被定义为 0,而这将会带来歧义。在一组重载函数中,如果两个函数一个需要整数参数,一个需要指针参数,当我们传入 NULL 时,将毫无疑问调用需要整数参数的函数,但根据语义来看其想要调用的函数应该是接受指针参数的函数。

三、算术类型

1. bool

用法bool类型变量只有两个值,truefalse

实现bool类型的最小实现位数并未定义,或许使用 1 Byte 保存单个bool变量,也可能使用 1 Byte 保存 8 个bool变量

字面值truefalse

2. char系

简介:包括charsigned charunsigned charwchar_tchar16_tchar32_t类型。

实现

  • charsigned charunsigned char类型的位数实现为 1 Byte;而char16_tchar32_t类型的位数分别实现为 16 bit 和 32 bit;wchar_t类型的位数根据平台的不同会有区别,可能为 16 bit 或 32 bit

  • 字符类型本质保存的是整数,当我们用字符字面量作为值时,其保存的是该字面量在某字符集中的编码值

  • 根据字符类型的特性,我们可以用char类型来保存比short还小的整数,但char类型并未规定默认实现为signed charunsigned char类型中的某一个,所以我们如果要用字符类型来保存小整数,应该使用signed charunsigned char类型而非char类型

字面值

  • 字符字面值

    • 单引号括起来的字符:'a'

    • 转义序列:'\n''\0''\x4d'

      转义序列包括两种,一种是语义化的符号,例如:\n\\\b等;

      另一种是泛化的转义序列,其形式是\后跟 1-3 个八进制数字或\x后跟 1 个或多个十六进制数字

  • 字符串字面值

    • 双引号括起来的字符序列:"abcd\n\123\x4d"。字符串中的字符可以是任何字符字面值

      字符串字面值实际上是一个字符数组,该数组的长度为实际字符个数 + 1,因为在字符串末尾还有有一个'\0'字符会被隐式添加进字符串中

  • 前缀

    • u:表示字符或字符串中的字符为char16_t类型,该前缀的字符或字符串编码会在编译时自动执行从源文件字符集到 UTF-16LE 字符集的转换
    • U:表示字符或字符串中的字符为char32_t类型,该前缀的字符或字符串编码会在编译时自动执行从源文件字符集到 UTF-32LE 字符集的转换
    • L:表示字符或字符串中的字符为wchar_t类型,该前缀的字符或字符串编码会在编译时自动执行从源文件字符集到 Unicode 字符集的转换,该字符集在 Windows 系统下通常为 UTF-16LE,在 Linux 系统下通常为 UTF-32LE
    • u8(仅字符串):字符串中的字符为char类型,该前缀的字符或字符串编码会在编译时自动执行从源文件字符集到 UTF-8 字符集的转换

3. int系

简介:包括shortintlonglong long以及它们的无符号版本,即在前面添加unsigned关键字,其中unsigned int可简写为unsigned。未显式添加unsigned关键字的整数类型默认都是有符号类型,也可添加signed关键字强调。

实现

  • 有符号整数类型通常采用补码实现
  • 整数类型的位数限制为:short(至少16bit)、int(至少16bit)、long(至少32bit)、long long(至少64bit),另外还需满足以下关系:1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

字面值

  • 整数类型的字面值有 3 种形式:

    • 十进制:以非 0 整数开始的整数,单个数字范围为0 - 9
    • 十六进制:以0x0X开始的整数,单个数字范围为0 - f
    • 八进制:以0开始的整数,单个数字范围为0 - 7
  • 后缀及对应类型

    每个整数字面值并不对应一个具体的整数类型,而是有一个候选类型列表,而该字面值的类型为对应候选列表中能保存该字面值的最小类型。而候选列表根据字面值的形式和后缀各有不同,具体情况如下表所示:

    后缀十进制八进制或十六进制
    (无后缀)int
    long int
    long long int
    int
    unsigned int
    long int
    unsigned long int
    long long int
    unsigned long long int
    uUunsigned int
    unsigned long int
    unsigned long long int
    unsigned int
    unsigned long int
    unsigned long long int
    lLlong int
    unsigned long int
    long long int
    long int
    unsigned long int
    long long int
    unsigned long long int
    同时有l/Lu/Uunsigned long int
    unsigned long long int
    unsigned long int
    unsigned long long int
    llLLlong long intlong long int
    unsigned long long int
    同时有ll/LLu/Uunsigned long long intunsigned long long int

4. float系

简介:包括floatdoublelong double三种类型

实现

  • 采用浮点编码实现
  • floatdouble通常是 IEEE-754 规定的类型,即float为 IEEE-754 binary32 格式,double为 IEEE-754 binary64 格式。而long double的实现可能是 IEEE-754 binary128 格式;也可能是 80 位 x87 扩展精度格式,许多 x86 和 x86-64 实现使用它(一个典型的例外是 MSVC,它将 long double 实现为与 double 相同的格式,即 binary64)

字面值

  • 浮点数字面值由小数部分和指数部分构成,当指数部分省略时,小数部分必须要有小数点存在,当小数部分不存在小数点时,指数部分不能省略,即
    • 3e2(此处e2作为指数部分不能省略)
    • 3.e2
    • .3e2
    • 3.3e2
  • 后缀及对应类型
    • (无后缀):double
    • fFfloat
    • lLlong double