• 数值常量

    数值常量

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

    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而不是导致溢出错误。