• C++标准模板(STL)- 类型支持(基本类型、RTTI、类型特性)


    对象、引用、函数(包括函数模板特化)和表达式具有称为类型的性质,它限制了对这些实体所容许的操作,并给原本寻常的位序列提供了语义含义。

    语言定义的基础类型

    void 类型

    void - 值为空集的类型。它是无法完成的不完整类型(从而不允许存在 void 类型的对象)。不存在 void 的数组,亦不存在到 void 的引用。然而容许 void 的指针和返回 void 类型的函数(其他语言中的过程)。

    std::nullptr_t

    定义于头文件

    typedef decltype(nullptr) nullptr_t;

    (C++11 起)

    std::nullptr_t 是空指针字面量 nullptr 的类型。它是独立类型,既非指针类型,亦非成员指针类型。

    布尔类型 

    bool - 足以保有二个值 true 或 false 之一的类型。 sizeof(bool) 的值由实现定义,而且可以异于 1

    整数类型 

    int - 基本整数类型。若使用了下列任何修饰符则可省略关键词 int 。若无长度修饰符,则它保证拥有至少 16 位宽度。然而在 32/64 位系统上,几乎专门保证它拥有至少 32 位宽度(见后述)。

    修饰符

    修饰整数类型。能以任何顺序混合使用。类型名中每组只能有一个。

    符号性

    signed - 目标类型将拥有有符号表示(若省略则此为默认)

    unsigned - 目标类型将拥有无符号表示

    大小

    short - 目标类型将为空间优化,且将有至少 16 位的宽度。

    long - 目标类型将有至少 32 位的宽度。

    long long - 目标类型将有至少 64 位的宽度。

    (C++11 起)

    注意:与所有类型说明符相同,容许采用任何顺序: unsigned long long int 与 long int unsigned long 指名同一类型。

    性质

    下表总结了所有可用的整数类型及其在各种常用数据模型中的性质:

    类型说明符等价类型按数据模型的位宽
    C++ 标准LP32ILP32LLP64LP64

    short

    short int至少 1616161616

    short int

    signed short

    signed short int

    unsigned short

    unsigned short int

    unsigned short int

    int

    int至少 1616323232

    signed

    signed int

    unsigned

    unsigned int

    unsigned int

    long

    long int至少 3232323264

    long int

    signed long

    signed long int

    unsigned long

    unsigned long int

    unsigned long int

    long long

    long long int
    (C++11)
    至少 6464646464

    long long int

    signed long long

    signed long long int

    unsigned long long

    unsigned long long int
    (C++11)

    unsigned long long int

    注意:整数算术对有符号和无符号整数类型的定义是不同的。见算术运算符,特别是整数溢出。

    std::size_t 是 sizeof 运算符还有 sizeof... 运算符及 alignof 运算符 (C++11 起)的结果的无符号整数类型。

    参阅定宽整数类型。 (C++11 起)

    数据模型

    每个实现关于基础类型大小所做的选择被统称为数据模型。有四个数据模型广为接受:

    32 位系统:

    • LP322/4/4 ( int 为 16 位, long 和指针为 32 位)
    • Win16 API
    • ILP324/4/4 ( int 、 long 和指针为 32 位)
    • Win32 API
    • Unix 和类 Unix 系统( Linux 、 Mac OS X )

    64 位系统:

    • LLP644/4/8 ( int 和 long 为 32 位,指针为 64 位)
    • Win64 API
    • LP644/8/8 ( int 为 32 位, long 和指针为 64 位)
    • Unix 和类 Unix 系统( Linux 、 Mac OS X )

    其他数据模型很罕见。例如, ILP648/8/8 : int 、 long 和指针为 64 位)只出现于某些早期 64 位 Unix 系统(例如 Unicos on Cray )。

     

    字符类型

    signed char - 有符号字符表示的类型。

    unsigned char - 无符号字符表示的类型。亦用于审查对象表示(无修饰内存)。

    char - 能在目标系统上最有效地处理的字符表示的类型(拥有与 signed char 或 unsigned char 之一相同的表示和对齐,但始终是独立的类型)。多字节字符串用此类型表示编码单元。各字符类型均大到足够表示任何 UTF-8 的八位编码单元。 (C++14 起) char 的符号性取决于编译器和目标平台: ARM 和 PowerPC 的默认设置常为无符号,而 x86 与 x64 的默认设置常为有符号。

    wchar_t - 宽字符表示的类型(见宽字符串)。要求大到足以表示任何受支持的字符编码位点(支持 Unicode 的系统上为 32 位。值得注意的例外是 Windows,其中 wchar_t 为 16 位并保有 UTF-16 编码单元)。它与整数类型之一具有相同的大小、符号性和对齐,但它是独立的类型。

    char16_t - UTF-16 字符表示的类型,要求大到足以表示任何 UTF-16 编码单元( 16 位)。它与 std::uint_least16_t 具有相同的大小、符号性和对齐,但它是独立的类型。

    char32_t - UTF-32 字符表示的类型,要求大到足以表示任何 UTF-32 编码单元( 32 位)。它与 std::uint_least32_t 具有相同的大小、符号性和对齐,但它是独立的类型。

    (C++11 起)

    char8_t - UTF-8 字符表示的类型,要求大到足以表示任何 UTF-8 编码单元( 8 位)。它与 unsigned char 具有相同的大小、符号性和对齐(从而与 char 和 signed char 具有相同的大小和对齐),但它是独立的类型。

    除了最小位数, C++ 标准还保证

    1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) 。

    注意:这允许一种极端情况,其中字节有 64 位大小,所有类型(包括 char )都有 64 位宽,而 sizeof 对每个类型均返回 1。

     

     浮点类型

    float - 单精度浮点类型。通常为 IEEE-754 32 位浮点类型

    double - 双精度浮点类型。通常为 IEEE-754 64 位浮点类型

    long double - 扩展精度浮点类型。不必映射到 IEEE-754 所强制的类型。在 x86 和 x86-64 架构上通常为 80 位 x87 浮点类型。

    性质

    浮点类型支持一些特殊值:

    • 无穷(正和负),见 INFINITY
    • 负零, -0.0 。它与正零比较相等,但在某些算术运算中有意义,例如 1.0/0.0 == INFINITY ,但 1.0/-0.0 == -INFINITY) ,而且对某些数学函数有意义,例如 sqrt(std::complex)
    • 非数 (NaN) ,它与任何值(包括自身)比较都不相等。多个位模式都表示 NaN ,见 std::nan 、 NAN 。注意 C++ 并不对发信 NaN 进行特殊对待,把所有 NaN 均当做静默 NaN,但提供了 std::numeric_limits::has_signaling_NaN 用以检测它们的支持情况。

    实浮点数可用于算术运算符 + - / * 和各种来自 的数学函数。内建运算符和库函数都可能引发浮点异常,并按 math_errhandling 中的描述设置 errno 。

    浮点表达式可拥有大于其类型所指定的值域和精度,见 FLT_EVAL_METHOD 。浮点表达式亦可收缩(contract),即如同所有中间值拥有无限范围和精度一般求值,见 #pragma STDC FP_CONTRACT 。

    浮点数上的某些运算受浮点环境的状态影响,并对其进行修改(最值得注意的是舍入方向)。

    在实浮点类型和整数类型间定义了隐式转换。

    浮点类型的其他细节、界限和性质见浮点类型的界限和 std::numeric_limits 。

    取值范围

    下表提供常用数值表示的界限的参考。

    C++20 之前,C++ 标准曾允许任意的有符号整数表示,而 N 位有符号整数的最小保证范围为从 -2N-1
    +1 到 +2N-1
    -1 (例如有符号 8 位类型为 -127127 ),这对应于反码原码的界限。

    然而,所有 C++ 编译器均使用补码表示,而从 C++20 起,这是标准所允许的唯一表示,所保证的范围为从 -2N-1
    到 +2N-1
    -1 (例如有符号 8 位类型为 -128127 )。

    类型位数格式取值范围
    近似精确
    字符8有符号-128127
    无符号0255
    16无符号065535
    32无符号01114111 (0x10ffff)
    整数16有符号± 3.27 · 104-3276832767
    无符号06.55 · 104065535
    32有符号± 2.14 · 109-2,147,483,6482,147,483,647
    无符号04.29 · 10904,294,967,295
    64有符号± 9.22 · 1018-9,223,372,036,854,775,8089,223,372,036,854,775,807
    无符号01.84 · 1019018,446,744,073,709,551,615
    浮点32IEEE-754
    • 最小非正规:
      ± 1.401,298,4 · 10-45
    • 最小正规:
      ± 1.175,494,3 · 10-38
    • 最大:
      ± 3.402,823,4 · 1038
    • 最小非正规:
      ±0x1p-149
    • 最小正规:
      ±0x1p-126
    • 最大:
      ±0x1.fffffep+127
    64IEEE-754
    • 最小非正规:
      ± 4.940,656,458,412 · 10-324
    • 最小正规:
      ± 2.225,073,858,507,201,4 · 10-308
    • 最大:
      ± 1.797,693,134,862,315,7 · 10308
    • 最小非正规:
      ±0x1p-1074
    • 最小正规:
      ±0x1p-1022
    • 最大:
      ±0x1.fffffffffffffp+1023

    注意:这些类型可表示的值的实际界限(与保证的最小界限相对)可通过 及 std::numeric_limits 获知。

    关键词

    void, bool, true, false, char, wchar_t, char8_t, char16_t, char32_t, int, short, long, signed, unsigned, float, double

     

  • 相关阅读:
    T1级,生产环境事故—Shell脚本一键备份K8s的YAML文件
    游戏设计模式专栏(一):工厂方法模式
    91.移动零(力扣)
    鸿蒙App动画、弹窗
    一些损失函数的学习
    GIC/ITS代码分析(11)LPI中断虚拟化之概述
    Flink的状态持久化和状态后端
    GaussDB细粒度资源管控技术透视
    mfc入门基础(六)创建模态对话框与非模态对话框
    基于DPDK(x86平台)应用性能优化实践
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/133428291