数值常量
数值常量是单一类型,并具有以下形式:
- hexdigit = digit | 'A'..'F' | 'a'..'f'
- octdigit = '0'..'7'
- bindigit = '0'..'1'
- HEX_LIT = '0' ('x' | 'X' ) hexdigit ( ['_'] hexdigit )*
- DEC_LIT = digit ( ['_'] digit )*
- OCT_LIT = '0' 'o' octdigit ( ['_'] octdigit )*
- BIN_LIT = '0' ('b' | 'B' ) bindigit ( ['_'] bindigit )*
- INT_LIT = HEX_LIT
- | DEC_LIT
- | OCT_LIT
- | BIN_LIT
- INT8_LIT = INT_LIT ['\''] ('i' | 'I') '8'
- INT16_LIT = INT_LIT ['\''] ('i' | 'I') '16'
- INT32_LIT = INT_LIT ['\''] ('i' | 'I') '32'
- INT64_LIT = INT_LIT ['\''] ('i' | 'I') '64'
- UINT_LIT = INT_LIT ['\''] ('u' | 'U')
- UINT8_LIT = INT_LIT ['\''] ('u' | 'U') '8'
- UINT16_LIT = INT_LIT ['\''] ('u' | 'U') '16'
- UINT32_LIT = INT_LIT ['\''] ('u' | 'U') '32'
- UINT64_LIT = INT_LIT ['\''] ('u' | 'U') '64'
- exponent = ('e' | 'E' ) ['+' | '-'] digit ( ['_'] digit )*
- FLOAT_LIT = digit (['_'] digit)* (('.' digit (['_'] digit)* [exponent]) |exponent)
- FLOAT32_SUFFIX = ('f' | 'F') ['32']
- FLOAT32_LIT = HEX_LIT '\'' FLOAT32_SUFFIX
- | (FLOAT_LIT | DEC_LIT | OCT_LIT | BIN_LIT) ['\''] FLOAT32_SUFFIX
- FLOAT64_SUFFIX = ( ('f' | 'F') '64' ) | 'd' | 'D'
- FLOAT64_LIT = HEX_LIT '\'' FLOAT64_SUFFIX
- | (FLOAT_LIT | DEC_LIT | OCT_LIT | BIN_LIT) ['\''] FLOAT64_SUFFIX
从结果中可以看出,数值常数可以包含下划线以便于阅读。
整数和浮点字面值可以用十进制(无前缀),二进制(前缀 0b ),八进制(前缀 0o )和十六进制(前缀 0x )表示法给出。
每个定义的数字类型都有一个字面值。 以一撇开始的后缀 (''') 叫 类型后缀 。
没有类型后缀的字面值是整数类型,除非字面值包含点或 E|e ,在这种情况下它是 浮点 类型。 整数类型是 int 如果字面值在 low(i32)..high(i32) 范围,否则是 int64 。 为了符号方便,类型后缀的撇号是可选的,如果它没有歧义(只有具有类型后缀的十六进制浮点字面值可能是不明确的)。
类型后缀是:
类型后缀 | 字面值类型 |
---|---|
'i8 | int8 |
'i16 | int16 |
'i32 | int32 |
'i64 | int64 |
'u | uint |
'u8 | uint8 |
'u16 | uint16 |
'u32 | uint32 |
'u64 | uint64 |
'f | float32 |
'd | float64 |
'f32 | float32 |
'f64 | float64 |
浮点字面值也可以是二进制,八进制或十六进制表示法: 根据IEEE浮点标准, 0B0_10001110100_0000101001000111101011101111111011000101001101001001'f64 约为 1.72826e35。
对字面值进行边界检查,以使它们适合数据类型。 非基数10字面值主要用于标志和位模式表示,因此边界检查是在位宽而非值范围上完成的。 如果字面值符合数据类型的位宽,则接受它。 因此:0b10000000'u8 == 0x80'u8 == 128,但是,0b10000000'i8 == 0x80'i8 == -1而不是导致溢出错误。