WebAssembly 程序操作基本数值。此外,在程序的定义中,不可变的值序列用于表示更复杂的数据,例如文本字符串或其他向量。

字节

最简单的值形式是原始的未解释字节。在抽象语法中,它们表示为十六进制字面量。

byte::=0x00 |  | 0xFF

约定

  • 元变量 b 表示字节。

  • 字节有时被解释为自然数 n<256

整数

不同类别的整数具有不同的值范围,这些范围由它们的位宽 N 和它们是无符号还是有符号来区分。

uN::=0 | 1 |  | 2N1sN::=2N1 |  | 1 | 0 | 1 |  | 2N11iN::=uN

iN 定义了未解释的整数,其有符号性解释可能根据上下文而异。在抽象语法中,它们表示为无符号值。但是,某些操作 转换 它们为有符号值,基于二进制补码的解释。

注意

本规范中出现的主要整数类型是 u32u64s32s64i8i16i32i64。但是,其他大小作为辅助结构出现,例如在 浮点数 的定义中。

约定

  • 元变量 m,n,i 表示整数。

  • 数字可以用简单的算术表示,如上语法所示。为了区分像 2N 这样的算术运算和像 (1)N 这样的序列,后者用括号区分。

浮点数

浮点数数据表示 32 位或 64 位值,这些值对应于 IEEE 754 标准(第 3.3 节)的相应二进制格式。

每个值都有一个符号和一个幅度。幅度可以表示为形式为 m0.m1m2mM2e正常数,其中 e 是指数,m尾数,其最高有效位 m01,或者表示为非规格化数,其中指数固定为最小可能的值,m00;非规格化数中包括正零和负零值。由于尾数是二进制值,因此正常数表示为 (1+m2M)2e 的形式,其中 Mm 的位宽;非规格化数类似。

可能的幅度还包括特殊值 (无穷大)和 nanNaN,非数字)。NaN 值具有一个有效载荷,描述基础 二进制表示 中的尾数位。不区分信号 NaN 和静默 NaN。

fN::=+fNmag | fNmagfNmag::=(1+uM2M)2e(if2E1+2e2E11)|(0+uM2M)2e(ife=2E1+2)||nan(n)(if1n<2M)

其中 M=signif(N)E=expon(N),并且

signif(32)=23expon(32)=8signif(64)=52expon(64)=11

规范 NaN 是一个浮点数 ±nan(canonN),其中 canonN 是一个有效载荷,其最高有效位为 1,而其他位均为 0

canonN=2signif(N)1

算术 NaN 是一个浮点数 ±nan(n),其中 ncanonN,使得最高有效位为 1,而其他位是任意的。

注意

在抽象语法中,非规格化数由尾数的开头 0 区分。非规格化数的指数与正常数的最小可能指数具有相同的值。只有在 二进制表示 中,非规格化数的指数的编码方式才与任何正常数的指数不同。

此处定义的规范 NaN 概念与 IEEE 754 标准(第 3.5.2 节)为十进制交换格式定义的规范 NaN 概念无关。

约定

  • 元变量 z 表示浮点数,在上下文中明确。

向量

数值向量是 128 位值,由向量指令(也称为SIMD 指令,单指令多数据)处理。它们在抽象语法中使用 i128 表示。通道类型(整数浮点数)和通道大小的解释由操作它们的特定指令确定。

名称

名称字符序列,这些字符是 Unicode(第 2.4 节)定义的标量值

name::=char(if|utf8(char)|<232)char::=U+00 |  | U+D7FF | U+E000 |  | U+10FFFF

由于 二进制格式 的限制,名称的长度受其 UTF-8 编码长度的限制。

约定

  • 字符(Unicode 标量值)有时与自然数 n<1114112 交换使用。