Values

WebAssembly programs operate on primitive numeric values. Moreover, in the definition of programs, immutable sequences of values occur to represent more complex data, such as text strings or other vectors.

Bytes

The simplest form of value are raw uninterpreted bytes. In the abstract syntax they are represented as hexadecimal literals.

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

Conventions

  • The meta variable \(b\) ranges over bytes.
  • Bytes are sometimes interpreted as natural numbers \(n < 256\).

Integers

Different classes of integers with different value ranges are distinguished by their bit width \(N\) and by whether they are unsigned or signed.

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

The latter class defines uninterpreted integers, whose signedness interpretation can vary depending on context. In the abstract syntax, they are represented as unsigned values. However, some operations convert them to signed based on a two’s complement interpretation.

Note

The main integer types occurring in this specification are \(\href{../syntax/values.html#syntax-int}{\def\mathdef2034#1{{\mathit{u}#1}}\mathdef2034{\mathit{32}}}\), \(\href{../syntax/values.html#syntax-int}{\def\mathdef2035#1{{\mathit{u}#1}}\mathdef2035{\mathit{64}}}\), \(\href{../syntax/values.html#syntax-int}{\def\mathdef2039#1{{\mathit{s}#1}}\mathdef2039{\mathit{32}}}\), \(\href{../syntax/values.html#syntax-int}{\def\mathdef2041#1{{\mathit{s}#1}}\mathdef2041{\mathit{64}}}\), \(\href{../syntax/values.html#syntax-int}{\def\mathdef2043#1{{\mathit{i}#1}}\mathdef2043{\mathit{8}}}\), \(\href{../syntax/values.html#syntax-int}{\def\mathdef2044#1{{\mathit{i}#1}}\mathdef2044{\mathit{16}}}\), \(\href{../syntax/values.html#syntax-int}{\def\mathdef2045#1{{\mathit{i}#1}}\mathdef2045{\mathit{32}}}\), \(\href{../syntax/values.html#syntax-int}{\def\mathdef2046#1{{\mathit{i}#1}}\mathdef2046{\mathit{64}}}\). However, other sizes occur as auxiliary constructions, e.g., in the definition of floating-point numbers.

Conventions

  • The meta variables \(m, n, i\) range over integers.
  • Numbers may be denoted by simple arithmetics, as in the grammar above. In order to distinguish arithmetics like \(2^N\) from sequences like \((1)^N\), the latter is distinguished with parentheses.

Floating-Point

Floating-point data consists of 32 or 64 bit values according to the IEEE 754 standard. Every value has a sign and a magnitude.

Magnitudes can either be expressed as normal numbers of the form \(m_0.m_1m_2\dots m_M \cdot2^e\), where \(e\) is the exponent and \(m\) is the significand whose most signifcant bit \(m_0\) is \(1\), or as a subnormal number where the exponent is fixed to the smallest possible value and \(m_0\) is \(0\); among the subnormals are positive and negative zero values. Since the significands are binary values, normals are represented in the form \((1 + m\cdot 2^{-M})\), where \(M\) is the bit width of \(m\); similarly for subnormals.

Possible magnitudes also include the special values \(\infty\) (infinity) and \(\href{../syntax/values.html#syntax-float}{\mathsf{nan}}\) (NaN, not a number). NaN values have a payload that describes the mantissa bits in the underlying binary representation. No distinction is made between signalling and quiet NaNs.

\[\begin{split}\begin{array}{llcll} \def\mathdef2028#1{{}}\mathdef2028{floating-point value} & \href{../syntax/values.html#syntax-float}{\def\mathdef2047#1{{\mathit{f}#1}}\mathdef2047{N}} &::=& {+} \href{../syntax/values.html#syntax-float}{\def\mathdef2048#1{{\mathit{f}#1}}\mathdef2048{\mathit{Nmag}}} ~|~ {-} \href{../syntax/values.html#syntax-float}{\def\mathdef2048#1{{\mathit{f}#1}}\mathdef2048{\mathit{Nmag}}} \\ \def\mathdef2028#1{{}}\mathdef2028{floating-point magnitude} & \href{../syntax/values.html#syntax-float}{\def\mathdef2048#1{{\mathit{f}#1}}\mathdef2048{\mathit{Nmag}}} &::=& (1 + \href{../syntax/values.html#syntax-int}{\def\mathdef2030#1{{\mathit{u}#1}}\mathdef2030{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}{\def\mathdef2030#1{{\mathit{u}#1}}\mathdef2030{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}\]

where \(M = \href{../syntax/values.html#aux-significand}{\mathrm{signif}}(N)\) and \(E = \href{../syntax/values.html#aux-exponent}{\mathrm{expon}}(N)\) with

\[\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}\]

A canonical NaN is a floating-point value \(\pm\href{../syntax/values.html#syntax-float}{\mathsf{nan}}(\href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N)\) where \(\href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N\) is a payload whose most significant bit is \(1\) while all others are \(0\):

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

An arithmetic NaN is a floating-point value \(\pm\href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)\) with \(n \geq \href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N\), such that the most significant bit is \(1\) while all others are arbitrary.

Conventions

  • The meta variable \(z\) ranges over floating-point values where clear from context.

Names

Names are sequences of scalar Unicode code points.

\[\begin{split}\begin{array}{llclll} \def\mathdef2028#1{{}}\mathdef2028{name} & \href{../syntax/values.html#syntax-name}{\mathit{name}} &::=& \href{../syntax/values.html#syntax-name}{\mathit{codepoint}}^\ast \qquad\qquad (\mathrel{\mbox{if}} |\href{../binary/values.html#binary-utf8}{\mathrm{utf8}}(\href{../syntax/values.html#syntax-name}{\mathit{codepoint}}^\ast)| < 2^{32}) \\ \def\mathdef2028#1{{}}\mathdef2028{code point} & \href{../syntax/values.html#syntax-name}{\mathit{codepoint}} &::=& \def\mathdef2088#1{\mathrm{U{+}#1}}\mathdef2088{00} ~|~ \dots ~|~ \def\mathdef2089#1{\mathrm{U{+}#1}}\mathdef2089{D7FF} ~|~ \def\mathdef2090#1{\mathrm{U{+}#1}}\mathdef2090{E000} ~|~ \dots ~|~ \def\mathdef2091#1{\mathrm{U{+}#1}}\mathdef2091{10FFFF} \\ \end{array}\end{split}\]

Due to the limitations of the binary format, the lengths of a name is bounded by the length of its UTF-8 encoding.

Convention

  • Code points are sometimes used interchangeably with natural numbers \(n < 1114112\).