跳转至

数字字面量

简单来说:

  • 123 0x123 123.456 1e-5 等会被识别为数字字面量。
  • 数字间可以用下划线分隔,如:123456123_456 等效,但 123_ 会导致报错(尾随下划线不允许)。

严谨点说:

  • 数字字面量以数字或小数点加数字开头,后接数字、字母、下划线、小数点、以及在指数部分可选的正负号;解析后会进行进一步的分类。

注意:0123ab.1e+e+ 等非法 token 也可能在初步识别阶段被视作数字字面量,最终会在语义解析阶段报错。

对于访问数字类型内部成员,应使用 (123).member 的形式;直接写 123.member 会被解析成浮点数语法并导致解析错误。

尾随下划线不允许,例如 123_ 会导致报错。

判断解析方式(整数或浮点)

  1. 含小数点的字面量会被解析为浮点数。
  2. 包含指数标识符 eE 的通常被解析为浮点数。
  3. 其余情况被解析为整数。

注:不允许以小数点开头(例如 .456),该形式会直接报错;请使用 0.456

整数

  • 常规整数形式:123123_456
  • 附带类型后缀示例:123_i32(建议渲染为 123_{(i32)})——类型后缀必须小写且前方带下划线。

前缀(整数前缀)

前缀后允许有下划线,例如:0x_123 是合法的;但 0_x123 是不合法的。

进制前缀(按最长匹配,不区分大小写)

  • 0b:二进制
  • 0o0:八进制
  • 0x0h:十六进制
  • 0d:十进制

有进制前缀的字面量必须为整数;其他无前缀的数字可视为十进制并可能为浮点。

若以 0 开头且没有明确前缀,则可能采用默认进制(例如八进制),请参照具体实现的词法规则。

建议将带基数的文本渲染为 123_{8}123_{16} 等以示区分。

使用 0f 前缀可用于表示特定格式的浮点字面量(例如十六进制浮点表示),示例:0f_0000_0000 表示 0.0_f32

整数后缀

整数虚数后缀

  • ijk(详见“虚数、四元数”部分)

整数进制后缀

  • b:二进制
  • o:八进制
  • xh:十六进制
  • d:十进制

整数类型后缀

  • i00:有符号整数(00 表示位数,例如 i32
  • u00:无符号整数(00 表示位数)
  • z:高精度整数(会触发大整数分配)
  • q:有理数表示(会触发内存分配)

(例如:渲染为 123_{(i32)}123456789_{(z)}

注意后缀顺序:永远按照进制、虚数、类型的顺序

浮点

  • 常规浮点形式:整数字段加小数部分,如 123.456
  • 整数后加点也合法,例如 123.
  • 科学计数法:123e456123.456e789e 前可有小数点,e 后不得有小数点)。

小数不能只以 . 开头,例如 .456 会导致报错。

1e-3 的虚数表示为 1ie-3(与 C 语言的表示不同)。

浮点后缀

浮点虚数后缀

  • ijk

浮点类型后缀

  • f00:浮点数(00 表示位数,例如 f32
  • q:有理数(转换为完全相等的有理数表示,例如 0.001 可转换为 1 / 1000

虚数、四元数

ijk 结尾的字面量会被识别为复数或四元数。前方不得有下划线(例如 123_i 是非法的)。

虚数后缀应写在类型后缀之前,例如 123i_i64

允许的数字形式包括:

  • 整数虚数:123i123_456i
  • 浮点虚数:123.456i123.i
  • 指数形式:123e456i123.456e789i

有理数

有理数字面量以 q 结尾,例如:123q123_456q123.456q

可以利用类型提升来构造有理数表达式,例如:123q / 456123 / 456q,但应避免滥用隐式类型提升。


相关内容:数值类型见 类型系统