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

字节

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

\[\begin{split}\begin{array}{llll} \def\mathdef2638#1{{}}\mathdef2638{byte} & \href{../syntax/values.html#syntax-byte}{\mathit{byte}} &::=& \def\mathdef2677#1{\mathtt{0x#1}}\mathdef2677{00} ~|~ \dots ~|~ \def\mathdef2678#1{\mathtt{0x#1}}\mathdef2678{FF} \\ \end{array}\end{split}\]

约定

  • 元变量 \(b\) 表示字节。

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

整数

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

\[\begin{split}\begin{array}{llll} \def\mathdef2638#1{{}}\mathdef2638{unsigned integer} & \href{../syntax/values.html#syntax-int}{\mathit{u}N} &::=& 0 ~|~ 1 ~|~ \dots ~|~ 2^N{-}1 \\ \def\mathdef2638#1{{}}\mathdef2638{signed integer} & \href{../syntax/values.html#syntax-int}{\mathit{s}N} &::=& -2^{N-1} ~|~ \dots ~|~ {-}1 ~|~ 0 ~|~ 1 ~|~ \dots ~|~ 2^{N-1}{-}1 \\ \def\mathdef2638#1{{}}\mathdef2638{uninterpreted integer} & \href{../syntax/values.html#syntax-int}{\mathit{i}N} &::=& \href{../syntax/values.html#syntax-int}{\mathit{u}N} \\ \end{array}\end{split}\]

\(\href{../syntax/values.html#syntax-int}{\mathit{i}N}\) 定义了未解释的整数,其有符号性解释可能根据上下文而异。在抽象语法中,它们表示为无符号值。但是,某些操作 转换 它们为有符号值,基于二进制补码的解释。

注意

本规范中出现的主要整数类型是 \(\href{../syntax/values.html#syntax-int}{\mathit{u32}}\)\(\href{../syntax/values.html#syntax-int}{\mathit{u64}}\)\(\href{../syntax/values.html#syntax-int}{\mathit{s32}}\)\(\href{../syntax/values.html#syntax-int}{\mathit{s64}}\)\(\href{../syntax/values.html#syntax-int}{\mathit{i8}}\)\(\href{../syntax/values.html#syntax-int}{\mathit{i16}}\)\(\href{../syntax/values.html#syntax-int}{\mathit{i32}}\)\(\href{../syntax/values.html#syntax-int}{\mathit{i64}}\)。但是,其他大小作为辅助结构出现,例如在 浮点数 的定义中。

约定

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

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

浮点数

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

每个值都有一个符号和一个幅度。幅度可以表示为形式为 \(m_0.m_1m_2\dots m_M \cdot2^e\)正常数,其中 \(e\) 是指数,\(m\)尾数,其最高有效位 \(m_0\)\(1\),或者表示为非规格化数,其中指数固定为最小可能的值,\(m_0\)\(0\);非规格化数中包括正零和负零值。由于尾数是二进制值,因此正常数表示为 \((1 + m\cdot 2^{-M}) \cdot 2^e\) 的形式,其中 \(M\)\(m\) 的位宽;非规格化数类似。

可能的幅度还包括特殊值 \(\infty\)(无穷大)和 \(\href{../syntax/values.html#syntax-float}{\mathsf{nan}}\)NaN,非数字)。NaN 值具有一个有效载荷,描述基础 二进制表示 中的尾数位。不区分信号 NaN 和静默 NaN。

\[\begin{split}\begin{array}{llcll} \def\mathdef2638#1{{}}\mathdef2638{floating-point value} & \href{../syntax/values.html#syntax-float}{\mathit{f}N} &::=& {+} \href{../syntax/values.html#syntax-float}{\mathit{f}\mathit{Nmag}} ~|~ {-} \href{../syntax/values.html#syntax-float}{\mathit{f}\mathit{Nmag}} \\ \def\mathdef2638#1{{}}\mathdef2638{floating-point magnitude} & \href{../syntax/values.html#syntax-float}{\mathit{f}\mathit{Nmag}} &::=& (1 + \href{../syntax/values.html#syntax-int}{\mathit{u}M}\cdot 2^{-M}) \cdot 2^e & (\mathrel{\mbox{if}} -2^{E-1}+2 \leq e \leq 2^{E-1}-1) \\ &&|& (0 + \href{../syntax/values.html#syntax-int}{\mathit{u}M}\cdot 2^{-M}) \cdot 2^e & (\mathrel{\mbox{if}} e = -2^{E-1}+2) \\ &&|& \infty \\ &&|& \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n) & (\mathrel{\mbox{if}} 1 \leq n < 2^M) \\ \end{array}\end{split}\]

其中 \(M = \href{../syntax/values.html#aux-significand}{\mathrm{signif}}(N)\)\(E = \href{../syntax/values.html#aux-exponent}{\mathrm{expon}}(N)\),并且

\[\begin{split}\begin{array}{lclllllcl} \href{../syntax/values.html#aux-significand}{\mathrm{signif}}(32) &=& 23 &&&& \href{../syntax/values.html#aux-exponent}{\mathrm{expon}}(32) &=& 8 \\ \href{../syntax/values.html#aux-significand}{\mathrm{signif}}(64) &=& 52 &&&& \href{../syntax/values.html#aux-exponent}{\mathrm{expon}}(64) &=& 11 \\ \end{array}\end{split}\]

规范 NaN 是一个浮点数 \(\pm\href{../syntax/values.html#syntax-float}{\mathsf{nan}}(\href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N)\),其中 \(\href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N\) 是一个有效载荷,其最高有效位为 \(1\),而其他位均为 \(0\)

\[\href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N = 2^{\href{../syntax/values.html#aux-significand}{\mathrm{signif}}(N)-1}\]

算术 NaN 是一个浮点数 \(\pm\href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)\),其中 \(n \geq \href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N\),使得最高有效位为 \(1\),而其他位是任意的。

注意

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

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

约定

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

向量

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

名称

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

\[\begin{split}\begin{array}{llclll} \def\mathdef2638#1{{}}\mathdef2638{name} & \href{../syntax/values.html#syntax-name}{\mathit{name}} &::=& \href{../syntax/values.html#syntax-name}{\mathit{char}}^\ast \qquad\qquad (\mathrel{\mbox{if}} |\href{../binary/values.html#binary-utf8}{\mathrm{utf8}}(\href{../syntax/values.html#syntax-name}{\mathit{char}}^\ast)| < 2^{32}) \\ \def\mathdef2638#1{{}}\mathdef2638{character} & \href{../syntax/values.html#syntax-name}{\mathit{char}} &::=& \def\mathdef2679#1{\mathrm{U{+}#1}}\mathdef2679{00} ~|~ \dots ~|~ \def\mathdef2680#1{\mathrm{U{+}#1}}\mathdef2680{D7FF} ~|~ \def\mathdef2681#1{\mathrm{U{+}#1}}\mathdef2681{E000} ~|~ \dots ~|~ \def\mathdef2682#1{\mathrm{U{+}#1}}\mathdef2682{10FFFF} \\ \end{array}\end{split}\]

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

约定

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