跳转至

数字字面量

简单来说

123 0x123 123.456 1e-5 等会被识别为数字字面量

数字间可以用下划线分隔,如:123456123_456 是等效的,但 123_ 会导致报错

严谨点说

数字字面量以数字或小数点加数字开头,后接数字、字母、下划线、小数点、开头非0加字母时e后可选的正负号,提取之后进行进一步的分类

注意:0123ab .1e+e+ 等非法 token 也会进入数字字面量解析

如果要访问数字字面量隐式类型提升为类后的成员,请使用 (123).xxx 这样的写法

尾随下划线是不被允许的,如:123_ 会导致报错
error: 数字字面量中不允许尾随下划线

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

  1. 有小数点的会被解析为浮点数
  2. 开头非 0[A-Za-z] 且包含 e 的会被解析为浮点数
  3. 其余会被解析为整数

判断完后进行进一步的解析

整数

  • 常规整数形式 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