---
title: 内置数据类型
description: "Ascend C提供b8~b64（8bit~64bit）四种不同位宽的数据类型，不同位宽对应的数据类型如下表所示。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendcopapi/atlas_ascendc_10_0019.html
sourcePath: /source/zh/canncommercial/900/API/ascendcopapi/atlas_ascendc_10_0019.html
indexId: d15ff73db569dc4c74bcbbb13d705bed23ee9a2b92d0e2236f8cd155c394c8f073
---
# 内置数据类型

#### 数据类型列表

Ascend C提供b8~b64（8bit~64bit）四种不同位宽的数据类型，不同位宽对应的数据类型如下表所示。


**表1 不同位宽对应的数据类型**

| 位宽 | 数据类型 |
| --- | --- |
| b8 | bool、int8\_t、uint8\_t、fp4x2\_e2m1\_t、fp4x2\_e1m2\_t、hifloat8\_t、fp8\_e5m2\_t、fp8\_e4m3fn\_t、fp8\_e8m0\_t、int4x2\_t。 |
| b16 | int16\_t、uint16\_t、half、bfloat16\_t。 |
| b32 | int32\_t、uint32\_t、float、complex32。 |
| b64 | int64\_t、uint64\_t、double、complex64。 |


为了方便描述这些数据类型，提供如下的数据类型简写：

| 数据类型简写（位宽从低到高） | 对应数据类型 |
| --- | --- |
| S4 | int4b\_t |
| U8 | uint8\_t |
| S8 | int8\_t |
| U16 | uint16\_t |
| S16 | int16\_t |
| U32 | uint32\_t |
| S32 | int32\_t |
| U64 | uint64\_t |
| S64 | int64\_t |
| FP8\_E4M3 | fp8\_e4m3fn\_t |
| HiF8 | hifloat8\_t |
| FP16 | half |
| BF16 | bfloat16\_t |
| FP32 | float |


其中，只有bool、int8_t、uint8_t、int16_t、uint16_t、half、int32_t、uint32_t、float、int64_t、uint64_t这些数据类型支持使用立即数进行赋值和初始化。

示例：

```
int8_t scalar = 1;
int32_t valueOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_ROUND>((float)1);
```


#### 数据类型的产品支持情况

| 产品 | 支持的数据类型 |
| --- | --- |
| Atlas 350 加速卡 | bool、int8\_t、uint8\_t、fp4x2\_e2m1\_t、fp4x2\_e1m2\_t、hifloat8\_t、fp8\_e5m2\_t、fp8\_e4m3fn\_t、fp8\_e8m0\_t、int4x2\_t、int16\_t、uint16\_t、half、bfloat16\_t、int32\_t、uint32\_t、float、complex32、int64\_t、uint64\_t、double、complex64。 |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | int8\_t、uint8\_t、int16\_t、uint16\_t、int32\_t、uint32\_t、int64\_t、uint64\_t、half、bfloat16\_t、float、double。 |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | int8\_t、uint8\_t、int16\_t、uint16\_t、int32\_t、uint32\_t、int64\_t、uint64\_t、half、bfloat16\_t、float、double。 |
| Atlas 200I/500 A2 推理产品 | int8\_t、uint8\_t、int16\_t、uint16\_t、int32\_t、uint32\_t、int64\_t、uint64\_t、half、float、double。 |
| Atlas 推理系列产品 AI Core | int8\_t、uint8\_t、int16\_t、uint16\_t、int32\_t、uint32\_t、int64\_t、uint64\_t、half、float、double。 |
| Atlas 推理系列产品 Vector Core | int8\_t、uint8\_t、int16\_t、uint16\_t、int32\_t、uint32\_t、int64\_t、uint64\_t、half、float、double。 |
| Atlas 训练系列产品 | int8\_t、uint8\_t、int16\_t、uint16\_t、int32\_t、uint32\_t、int64\_t、uint64\_t、half、float、double。 |


#### 布尔型

bool类型占8比特，全0时代表false，否则代表true。


#### 整数

整数由符号位（S）和数值部分（M）组成，不同类型的整数在符号位和数值部分的比特分配上有所不同。无符号整数没有符号位，所有比特均用于表示数值。

下图是一个int8_t类型的示例，其符号位占用1位，数值部分占用7位。Sv=1，Mv = 25 + 26，表示的结果为96。下标v表示符号位和数值部分的具体数值。


整数数据类型取值范围见下表。


**表2 整数数据类型取值范围**

| 类型 | 取值范围 |
| --- | --- |
| int4x2\_t（int4b\_t） | [\-8, 7] |
| int8\_t | [\-128, 127] |
| uint8\_t | [0, 255] |
| int16\_t | [\-32768, 32767] |
| uint16\_t | [0, 65535] |
| int32\_t | [\-2147483648, 2147483647] |
| uint32\_t | [0, 4294967295] |
| int64\_t | [\-9223372036854775808, 9223372036854775807] |
| uint64\_t | [0,18446744073709551615] |


int4x2_t数据类型会将两个独立的四位整形数打包为一个8比特存储单元。


#### 浮点数

浮点数数据类型的取值范围如下表所示。


**表3 浮点数据类型**

| 类型 | 符号位宽 | 指数位宽 | 尾数位宽 | 取值范围 |
| --- | --- | --- | --- | --- |
| fp4x2\_e2m1\_t | 1 | 2 | 1 | [\-6, 6] |
| fp4x2\_e1m2\_t | 1 | 1 | 2 | [\-7 \* 2\-2, 7 \* 2\-2] |
| fp8\_e8m0\_t | 1 | 8 | 0 | [2\-127, 2\-127] |
| fp8\_e5m2\_t | 1 | 5 | 2 | [213 \- 216, 216 \- 213] |
| fp8\_e4m3fn\_t | 1 | 4 | 3 | [26 \- 29, 29 \- 26] |
| half | 1 | 5 | 10 | [25 \- 216, 216 \- 25] |
| bfloat16\_t | 1 | 8 | 7 | [2120 \- 2128, 2128 \- 2120] |
| float | 1 | 8 | 23 | [2104 \- 2128, 2128 \- 2104] |
| double | 1 | 11 | 52 | [2971 \- 21024, 21024 \- 2971] |


fp4x2_e2m1_t和fp4x2_e1m2_t数据类型会将两个独立的四位浮点数打包为一个8比特存储单元。


浮点数由符号位（S）、指数（E）、尾数（M）三个部分组成，不同类型的浮点数，三个部分所占的比特数可能不同。

- fp4x2_e2m1_t
  下图是一个fp4x2_e2m1_t类型的示例，其符号位占用1位，指数位占用2位，尾数位占用1位。

- fp4x2_e1m2_t
  下图是一个fp4x2_e1m2_t类型的示例，其符号位占用1位，指数位占用1位，尾数位占用2位。

- fp8_e8m0_t（fp8_e8m0_t二进制由bfloat16类型舍弃符号位，小数位得到）
  下图是一个fp8_e8m0_t类型的示例，其符号位占用1位，指数位占用8位，尾数位占用0位。

- fp8_e5m2_t
  下图是一个fp8_e5m2_t类型的示例，其符号位占用1位，指数占用5位，尾数占用2位，表示的结果为 (-1)^0 × (2 - 0.25) × 2^(30 -15)=1.75 × 2^15。

  fp8_e5m2_t的特殊值bit位表示如下：

- fp8_e4m3fn_t
  下图是一个fp8_e4m3fn_t类型的示例，其符号位占用1位，指数占用4位，尾数占用3位，表示的结果为 (-1)^1 × 2^-3 × 2^-6。

  fp8_e4m3fn_t的特殊值bit位表示如下：

- hifloat8_t
hifloat8_t类型相对其他类型增加了指数位宽控制字段D，用于指示指数位和尾数位的编码方式。
hifloat8_t类型根据点域的不同，有不同的编码方式，下面一一列出。符号、指数和尾数分别缩写成‘S’，‘E’和‘M’。
图1 S、E、M在不同点域D值下的bit位分布
下图示例中，其符号位占用1位，指数占用2位，尾数占用3位，D字段为2比特b01，Sv=1，Ev=3，Mv = 2-1 + 2-2，表示的结果为14。下标v表示各部分的具体数值。
hifloat8_t类型的取值范围如下表所示：

**表4 hifloat8_t类型取值范围**

| 符号位宽 | 指数位宽控制字段位宽 | 指数位宽 | 尾数位宽 | 指数位宽控制字段取值 | 符号取值范围（Sv） | 指数取值范围（Ev） | 尾数取值范围（Mv） | 取值范围计算公式 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 1 | 4 | 0 | 3 | 4'b0000 | ±1 | \- | [0, 7] | Sv \* 2Mv \- 23 |
| 1 | 4 | 0 | 3 | 4'b0001 | ±1 | 0 | [0, 7 \* 2\-3] | Sv \* 2Ev \* (1 + Mv) |
| 1 | 3 | 1 | 3 | 4'b001 | ±1 | ±1 | [0, 7 \* 2\-3] | Sv \* 2Ev \* (1 + Mv) |
| 1 | 2 | 2 | 3 | 2'b01 | ±1 | ±[2, 3] | [0, 7 \* 2\-3] | Sv \* 2Ev \* (1 + Mv) |
| 1 | 2 | 3 | 2 | 2'b10 | ±1 | ±[4, 7] | [0, 3 \* 2\-2] | Sv \* 2Ev \* (1 + Mv) |
| 1 | 2 | 4 | 1 | 2'b11 | ±1 | ±[8, 15] | [0, 2\-1] | Sv \* 2Ev \* (1 + Mv) |


hifloat8_t特殊值bit位表示如下：
hifloat8_t数据类型计算公式如下：

  - 符号位Sv
    s_bit_val为1表示负数，s_bit_val为0表示非负数。

  - 指数位Ev
    由Es、Em组成。

**表5 不同D域值，Es，Em bit大小不同**

| D 值 | Es 值范围 | Em 值范围 |
| --- | --- | --- |
| 3b001 | 0\-1 | \- |
| 2b01 | 0\-1 | 10~11 |
| 2b10 | 0\-1 | 100~111 |
| 2b11 | 0\-1 | 1000~1111 |


    es_bit_val值表示E的最高位，用于计算Ev的符号值，例如E为0b1100，则es_bit_val值为最高位1，例如E为0b011，则es_bit_val为最高位0。

    Es计算公式：

    Em计算公式如下，D表示点域值，参考表5。

    Ev计算公式：

    Mv计算公式，M表示位数值，bitwidth of M表示M的bit宽度大小，参考表5。

  - 在Normal和Subnormal模式下，浮点数的取值计算公式不同：
    Normal模式：由Sv、Ev、Mv组成。

    Subnormal模式，由Sv、Mv组成。

- half
  下图是一个half类型的示例，其符号位占用1位，指数占用5位，尾数占用10位。Sv=1，Ev=15，Mv = 2-1 + 2-2，表示的结果为1.75。下标v表示各部分的具体数值。

  half特殊值bit位表示如下：

- bfloat16_t
  下图是一个bfloat16_t数据类型的示例，其符号位占用1位，指数占用8位，尾数占用7位。

  bfloat16_t特殊值bit位表示如下：

- float
  下图是一个float类型的示例，其符号位占用1位，指数占用8位，尾数占用23位。

  float特殊值bit位表示如下：


#### 复数

Ascend C提供了复数数据类型，complex32和complex64。

定义是：

```
using complex32 = AscendC::Complex<half>;
using complex64 = AscendC::Complex<float>;
```

其中Complex定义结构见complex32/complex64。

complex32即实部和虚部都是half类型的复数，

complex64即实部和虚部都是float类型的复数。

示例：

```
complex32 value0(1, 2);
value0将代表实部为1，虚部为2的复数，即1+2j
complex32 value1(3);
value1将代表实部为3，虚部为0的复数，即3+0j
complex64 value2 = 4;
value2将代表实部为4，虚部为0的复数，即4+0j
```

当前仅Atlas 350 加速卡支持。
