数字字面量¶
简单来说
123 0x123 123.456 1e-5 等会被识别为数字字面量
数字间可以用下划线分隔,如:123456 与 123_456 是等效的,但 123_ 会导致报错。
严谨点说
数字字面量以数字或小数点加数字开头,后接数字、字母、下划线、小数点、开头非0加字母时e后可选的正负号,提取之后进行进一步的分类。
注意:0123ab .1e+e+ 等非法 token 也会进入数字字面量解析
如果要访问数字字面量隐式类型提升为类后的成员,请使用 (123).xxx 这样的写法
尾随下划线是不被允许的,如:123_ 会导致报错
error: 数字字面量中不允许尾随下划线
判断解析方式 (整数或浮点)¶
- 有小数点的会被解析为浮点数
- 开头非
0[A-Za-z]且包含e的会被解析为浮点数 - 其余会被解析为整数
判断完后进行进一步的解析
整数¶
- 常规整数形式
123123_456 - 附带类型后缀
123_i32建议显示为 123_{(i32)}
前缀 - 整数前缀¶
注意:前缀后可以有下划线,如 0x_123 是合法的。
进制前缀 (按照最长匹配 不区分大小写)
0b二进制0b10h这样的写法要解析成十六进制0o0八进制0x0h十六进制0d十进制- 有进制前缀的必须为整数,其它视为常规十进制,可为浮点
若以 0 开头,则解析进制后缀,无进制后缀则为八进制
建议将文本渲染为 123_{8} 123_{16}
使用 0f 前缀直接使用十六进制表示指定浮点数,如使用 0f_0000_0000 表示 0.0_f32。
整数后缀¶
虚数后缀
ijk见 虚数、四元数
进制后缀
b二进制o八进制xh十六进制d十进制
类型后缀
i00有符号整数 (00 为位数) 单独的i被视为复数后缀u00无符号整数 (00 为位数)z高精度整数q有理数
建议将文本渲染为 123_{(i32)} 123456789_{(z)}
顺序:类型、虚数、进制,如 123hi_i32
浮点¶
- 常规浮点数形式
- 整数与小数
123.456 - 整数后加点
123. - 小数前加点
.456
- 整数与小数
- 科学计数法
123e456123.456e789
e前可以有小数点,e后不能有小数点
1e-3对应虚数写为1ie-3(和 C 不太一样)
浮点后缀¶
虚数后缀
ijk见 虚数、四元数
类型后缀
i00有符号整数 (00 为位数) warning: 浮点字面量被转换为整数u00无符号整数 (00 为位数) warning: 浮点字面量被转换为整数f00浮点数 (00 为位数)z高精度整数 warning: 浮点字面量被转换为整数q有理数 (转换为接近的有理数) (0.001转换为1 / 1000)
虚数、四元数¶
以后缀 i j k 结尾的数字会被识别为复数或四元数
允许的数字形式为:
- 常规整数
123i123_456i - 常规浮点数
123.456i123.i.456i - 科学计数法
123e456i123.456e789i
有理数¶
有理数形式为
- 整数
123q123_456q - 浮点
123.456q
可以利用类型提升来构建新有理数
如:123q / 456 123 / 456q