数字字面量¶
简单来说:
1230x123123.4561e-5等会被识别为数字字面量。- 数字间可以用下划线分隔,如:
123456与123_456等效,但123_会导致报错(尾随下划线不允许)。
严谨点说:
- 数字字面量以数字或小数点加数字开头,后接数字、字母、下划线、小数点、以及在指数部分可选的正负号;解析后会进行进一步的分类。
注意:
0123ab、.1e+e+等非法 token 也可能在初步识别阶段被视作数字字面量,最终会在语义解析阶段报错。
对于访问数字类型内部成员,应使用 (123).member 的形式;直接写 123.member 会被解析成浮点数语法并导致解析错误。
尾随下划线不允许,例如 123_ 会导致报错。
判断解析方式(整数或浮点)¶
- 含小数点的字面量会被解析为浮点数。
- 包含指数标识符
e或E的通常被解析为浮点数。 - 其余情况被解析为整数。
注:不允许以小数点开头(例如
.456),该形式会直接报错;请使用0.456。
整数¶
- 常规整数形式:
123、123_456 - 附带类型后缀示例:
123_i32(建议渲染为 123_{(i32)})——类型后缀必须小写且前方带下划线。
前缀(整数前缀)¶
前缀后允许有下划线,例如:0x_123 是合法的;但 0_x123 是不合法的。
进制前缀(按最长匹配,不区分大小写)
0b:二进制0o或0:八进制0x或0h:十六进制0d:十进制
有进制前缀的字面量必须为整数;其他无前缀的数字可视为十进制并可能为浮点。
若以 0 开头且没有明确前缀,则可能采用默认进制(例如八进制),请参照具体实现的词法规则。
建议将带基数的文本渲染为 123_{8}、123_{16} 等以示区分。
使用 0f 前缀可用于表示特定格式的浮点字面量(例如十六进制浮点表示),示例:0f_0000_0000 表示 0.0_f32。
整数后缀¶
整数虚数后缀¶
i、j、k(详见“虚数、四元数”部分)
整数进制后缀¶
b:二进制o:八进制x、h:十六进制d:十进制
整数类型后缀¶
i00:有符号整数(00 表示位数,例如i32)u00:无符号整数(00 表示位数)z:高精度整数(会触发大整数分配)q:有理数表示(会触发内存分配)
(例如:渲染为 123_{(i32)}、123456789_{(z)})
注意后缀顺序:永远按照进制、虚数、类型的顺序
浮点¶
- 常规浮点形式:整数字段加小数部分,如
123.456。 - 整数后加点也合法,例如
123.。 - 科学计数法:
123e456、123.456e789(e前可有小数点,e后不得有小数点)。
小数不能只以 . 开头,例如 .456 会导致报错。
1e-3 的虚数表示为 1ie-3(与 C 语言的表示不同)。
浮点后缀¶
浮点虚数后缀¶
i、j、k
浮点类型后缀¶
f00:浮点数(00 表示位数,例如f32)q:有理数(转换为完全相等的有理数表示,例如0.001可转换为1 / 1000)
虚数、四元数¶
以 i、j、k 结尾的字面量会被识别为复数或四元数。前方不得有下划线(例如 123_i 是非法的)。
虚数后缀应写在类型后缀之前,例如 123i_i64。
允许的数字形式包括:
- 整数虚数:
123i、123_456i - 浮点虚数:
123.456i、123.i - 指数形式:
123e456i、123.456e789i
有理数¶
有理数字面量以 q 结尾,例如:123q、123_456q 或 123.456q。
可以利用类型提升来构造有理数表达式,例如:123q / 456 或 123 / 456q,但应避免滥用隐式类型提升。
相关内容:数值类型见 类型系统。