跳到主要内容

基本数据类型

void 类型

概述

void类型不对应具体的值,仅用于一些特殊的场合,例如函数不返回任何值时使用空类型作为返回类型。

注意

  • void类型是无法变为完整的不完整类型,所以不允许存在void类型的对象,包括含有void的数组以及到void的引用
  • 存在指向void的指针与函数

void*类型

用于保存任何类型对象的指针

  • 任意类型对象的指针都可以被隐式地转换成void*指针;void*指针无法隐式转换为其他类型的指针
  • void*类型可用的操作有限,包括
    • 与其他指针比较
    • 作为函数的输入或输出
    • 赋值给另一个void*指针

std::nullptr_t

概述

std::nullptr_t是空指针字面量nullptr的类型。

该类型的对象值只可能是nullptr

主要用途在于需要函数重载时,例如:

f(int *);
f(double *);
f(std::nullptr);

字面量

该类型的字面量仅有nullptr

bool 类型

概述:用来表示只有两种状态的值的类型。属于整型的一种,可以无损转换为其他整型,但其他整型无法无损转换为该类型。

实现:最小尺寸未定义。

理论上bool类型仅用一个 bit 即可实现,但考虑到内存的最小访问单元是一个 Byte,所以bool通常占用 1 个 Byte

字面值

  • true
  • false

字符类型

概述:字符类型用来表示各种字符,包括可视与不可视的字符。属于整型的一种,可以和相同尺寸的整型相互进行无损转换

实现

  • char:最小占 8 bit 空间。用来保存 ASCII 编码的字符

  • signed charunsigned charchar类型的指定符号版本。和char类型占用空间相同,也保存 ASCII 编码的字符

    整数类型的最小尺寸为 16 bit,而作为整型的字符类型最小可以达到 8 bit,所以可以用更小的空间来保存小数字。而char类型并未定义是有符号或是无符号的,所以如果用char类型来表示整数,那么应该使用它的指定符号版本

  • wchar_t:最小占 16 bit 空间,通常为 16 bit 或 32 bit。默认用来保存 Unicode 编码的字符,具体的编码格式根据环境不同而有所区别

  • char16_t:占 16 bit 空间。用来保存 UTF-16 编码的字符,字节序根据环境不同而有所区别

  • char32_t:占 32 bit 空间。用来保存 UTF-32 编码的字符。字节序根据环境不同而有所区别

字面值

  • 用单引号引出的单个基本字符、转义序列以及通用字符名
    • 基本字符:来自基本源字符集去掉单引号('),反斜杠(\)和换行符后的字符
    • 转义序列:包括简单转义序列与数值转义序列,可参考转义序列
    • 通用字符名:参考转义序列
  • 前缀
    • 无前缀:char类型字面值
    • Lwchar_t类型字面值,自动转换为wchar_t类型对应编码的值
    • uchar16_t类型字面值,自动转换为char16_t类型对应编码的值
    • Uchar32_t类型字面值,自动转换为char32_t类型对应编码的值

字符串 字面值

  • 由双引号引出的字符字面值序列,字符字面值序列中的字符可以由任意类型的字符任意组合
  • 前缀
    • 无前缀:char *字符串
    • Lwchar_t *字符串,自动转换为wchar_t类型对应编码的值
    • uchar16_t *字符串,自动转换为char16_t类型对应编码的值
    • Uchar32_t *字符串,自动转换为char32_t类型对应编码的值
    • u8char *字符串,自动转换为UTF-8编码的值

整数类型

概述:用来表示带符号或不带符号的整数值的类型。

实现

  • 带符号整数类型:short(至少 16 bit)、int(至少 16 bit)、long(至少 32 bit)、long long(至少 64 bit)
  • 无符号整数类型:unsigned short(同short)、unsigned(同int)、unsigned long(同long)、unsigned long long(同long long
  • 以上类型说明符皆为最简写法。在此之上所有带符号整数类型还可以显式添加signed作为前缀;除了int类型外,其他所有类型都可以添加int作为后缀
  • 带符号整数类型可以用反码、原码或补码实现,在大部分设备上都使用补码实现
  • 无符号整数类型与其二进制序列可以直接进行代数转换
  • C++ 标准除了规定最小位数之外,还保证:1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

字面值

  • 十进制、八进制或十六进制整数:

    • 十进制整数即以非零十进制数字开始的一个十进制数字(0 ~ 9)序列

    • 八进制整数是以数字0开头的一个八进制数字(0 ~ 7)序列

    • 十六进制是以字符序列0x0X开头的一个十六进制数字(0 ~ f/F)序列

    整数字面值实际上不包含负数,但并不影响需要负数时的使用。我们仍然可以在字面值前添加负号(-),虽然其实际的效果是一个一元运算符,它的作用是对操作数取负

  • 后缀:整数字面值的类型并不一定是一个具体的类型,它的类型取决于后缀、字面值实际大小以及字面值进制这三个方面。根据后缀和进制我们可以得到一个字面值类型的候选列表,然后再根据字面值的实际大小确定该字面值的类型,即候选列表中能保存该值的最小类型。具体如下表所示:

    后缀十进制底八进制、十六进制底
    (无后缀)int
    long
    long long
    int
    unsigned
    long
    unsigned long
    long long
    unsigned long long
    u/Uunsigned
    unsigned long
    unsigned long long
    unsigned
    unsigned long
    unsigned long long
    l/Llong
    long long
    long
    unsigned long
    long long
    unsigned long long
    同时有l/Lu/Uunsigned long
    unsigned long long
    unsigned long
    unsigned long long
    ll/LLlong longlong long
    unsigned long long
    同时有ll/LLu/Uunsigned long longunsigned long long

浮点数类型

概述:用来表示实数的类型

实现

字面值

  • 一个浮点数字面值的必要部分是小数点和指数部分二者其中之一,也可以二者兼有。

    • 若实数部分仅包含整数部分,没有小数点和小数部分,则必须包含指数部分,即:1e22E3

    • 若实数部分包含小数点,则指数部分为可选,即:0.3.14

    • 当实数部分既包含小数点也包含小数部分时,整数部分也为可选,即:.314e1.14

    指数部分用e/E指出,e/E后的部分即为指数部分,按照科学计数法进行解释,即以 10 为底的指数。

    例如:31.4e-131.4×10131.4\times 10^{-1}

  • 后缀

    • 无后缀:浮点数字面值的默认类型为double
    • f/F:浮点数字面值类型为float
    • l/L:浮点数字面值类型为long double