数字字面量¶
简单来说
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
的会被解析为浮点数 - 其余会被解析为整数
判断完后进行进一步的解析
整数¶
- 常规整数形式
123
123_456
- 附带类型后缀
123_i32
建议显示为 123_{(i32)}
整数前缀¶
进制前缀 (按照最长匹配 不区分大小写)
0b
二进制0b10h
这样的写法要解析成十六进制0o
0
八进制0x
0h
十六进制0d
十进制- 有进制前缀的必须为整数,其它视为常规十进制,可为浮点
若以 0 开头,则解析进制后缀,无进制后缀则为八进制
建议将文本渲染为 123_{8} 123_{16}
整数后缀¶
虚数后缀
i
j
k
见 虚数、四元数
进制后缀
b
二进制o
八进制x
h
十六进制d
十进制
类型后缀
i00
有符号整数 (00 为位数) 单独的i
被视为复数后缀u00
无符号整数 (00 为位数)z
高精度整数q
有理数
建议将文本渲染为 123_{(i32)} 123456789_{(z)}
顺序:类型、虚数、进制,如 123hi_i32
浮点¶
- 常规浮点数形式
- 整数与小数
123.456
- 整数后加点
123.
- 小数前加点
.456
- 整数与小数
- 科学计数法
123e456
123.456e789
e
前可以有小数点,e
后不能有小数点
1e-3
对应虚数写为1ie-3
(和 C 不太一样)
浮点后缀¶
虚数后缀
i
j
k
见 虚数、四元数
类型后缀
i00
有符号整数 (00 为位数) warning: 浮点字面量被转换为整数u00
无符号整数 (00 为位数) warning: 浮点字面量被转换为整数f00
浮点数 (00 为位数)z
高精度整数 warning: 浮点字面量被转换为整数q
有理数 (转换为接近的有理数) (0.001
转换为1 / 1000
)
虚数、四元数¶
以后缀 i
j
k
结尾的数字会被识别为复数或四元数
允许的数字形式为:
- 常规整数
123i
123_456i
- 常规浮点数
123.456i
123.i
.456i
- 科学计数法
123ie456
123.456ie789
有理数¶
有理数形式为
- 整数
123q
123_456q
- 浮点
123.456q
可以利用类型提升来构建新有理数
如:123q / 456
123 / 456q