数值常量

数值常量是单一类型,并具有以下形式:

  1. hexdigit = digit | 'A'..'F' | 'a'..'f'
  2. octdigit = '0'..'7'
  3. bindigit = '0'..'1'
  4. HEX_LIT = '0' ('x' | 'X' ) hexdigit ( ['_'] hexdigit )*
  5. DEC_LIT = digit ( ['_'] digit )*
  6. OCT_LIT = '0' 'o' octdigit ( ['_'] octdigit )*
  7. BIN_LIT = '0' ('b' | 'B' ) bindigit ( ['_'] bindigit )*
  8.  
  9. INT_LIT = HEX_LIT
  10. | DEC_LIT
  11. | OCT_LIT
  12. | BIN_LIT
  13.  
  14. INT8_LIT = INT_LIT ['\''] ('i' | 'I') '8'
  15. INT16_LIT = INT_LIT ['\''] ('i' | 'I') '16'
  16. INT32_LIT = INT_LIT ['\''] ('i' | 'I') '32'
  17. INT64_LIT = INT_LIT ['\''] ('i' | 'I') '64'
  18.  
  19. UINT_LIT = INT_LIT ['\''] ('u' | 'U')
  20. UINT8_LIT = INT_LIT ['\''] ('u' | 'U') '8'
  21. UINT16_LIT = INT_LIT ['\''] ('u' | 'U') '16'
  22. UINT32_LIT = INT_LIT ['\''] ('u' | 'U') '32'
  23. UINT64_LIT = INT_LIT ['\''] ('u' | 'U') '64'
  24.  
  25. exponent = ('e' | 'E' ) ['+' | '-'] digit ( ['_'] digit )*
  26. FLOAT_LIT = digit (['_'] digit)* (('.' digit (['_'] digit)* [exponent]) |exponent)
  27. FLOAT32_SUFFIX = ('f' | 'F') ['32']
  28. FLOAT32_LIT = HEX_LIT '\'' FLOAT32_SUFFIX
  29. | (FLOAT_LIT | DEC_LIT | OCT_LIT | BIN_LIT) ['\''] FLOAT32_SUFFIX
  30. FLOAT64_SUFFIX = ( ('f' | 'F') '64' ) | 'd' | 'D'
  31. FLOAT64_LIT = HEX_LIT '\'' FLOAT64_SUFFIX
  32. | (FLOAT_LIT | DEC_LIT | OCT_LIT | BIN_LIT) ['\''] FLOAT64_SUFFIX

从结果中可以看出,数值常数可以包含下划线以便于阅读。

整数和浮点字面值可以用十进制(无前缀),二进制(前缀 0b ),八进制(前缀 0o )和十六进制(前缀 0x )表示法给出。

每个定义的数字类型都有一个字面值。 以一撇开始的后缀 (''') 叫 类型后缀 。

没有类型后缀的字面值是整数类型,除非字面值包含点或 E|e ,在这种情况下它是 浮点 类型。 整数类型是 int 如果字面值在 low(i32)..high(i32) 范围,否则是 int64 。 为了符号方便,类型后缀的撇号是可选的,如果它没有歧义(只有具有类型后缀的十六进制浮点字面值可能是不明确的)。

类型后缀是:

类型后缀字面值类型
'i8int8
'i16int16
'i32int32
'i64int64
'uuint
'u8uint8
'u16uint16
'u32uint32
'u64uint64
'ffloat32
'dfloat64
'f32float32
'f64float64

浮点字面值也可以是二进制,八进制或十六进制表示法: 根据IEEE浮点标准, 0B0_10001110100_0000101001000111101011101111111011000101001101001001'f64 约为 1.72826e35。

对字面值进行边界检查,以使它们适合数据类型。 非基数10字面值主要用于标志和位模式表示,因此边界检查是在位宽而非值范围上完成的。 如果字面值符合数据类型的位宽,则接受它。 因此:0b10000000'u8 == 0x80'u8 == 128,但是,0b10000000'i8 == 0x80'i8 == -1而不是导致溢出错误。