【区块链安全 | 第十五篇】类型之值类型(二)

在这里插入图片描述

值类型

有理数和整数字面量(Rational and Integer Literals)

整数字面量由一串数字(范围为 0-9)组成,按十进制解析。例如,69 代表六十九。Solidity 中没有八进制字面量,且前导零是无效的。

十进制小数字面量由一个小数点(.)和至少一个小数点后的数字组成。例如,.11.3 是有效的(但 1. 是无效的)。

科学记数法格式(如 2e10)也被支持,其中尾数(mantissa)可以是小数,但指数必须是整数。字面量 MeE 等价于 M * 10**E。例如,2e10-2e102e-102.5e1 都是有效的。

可以使用下划线分隔数字字面量中的数字,以提高可读性。例如,十进制的 123_000、十六进制的 0x2eff_abde、科学记数法表示的 1_2e345_678 都是有效的。下划线只能放在两个数字之间,并且只允许使用一个连续的下划线。数字字面量中的下划线不会增加额外的语义意义,下划线会被忽略。

数字字面量表达式保留任意精度,直到它们被转换为非字面量类型(即,与其他非数字字面量表达式一起使用,或者通过显式转换)。这意味着数字字面量表达式中的计算不会溢出,除法操作不会截断。

例如, (2**800 + 1) - 2**800 结果为常量 1(类型为 uint8),尽管中间结果甚至无法容纳在机器字长中。此外, .5 * 8 结果为整数 4(尽管中间使用了非整数)。

注意
尽管大多数运算符应用于字面量时会产生字面量表达式,但有些运算符并不遵循这一模式:

  • 三元操作符(... ? ... : ...
  • 数组下标(<array>[<index>]

例如,你可能会期望像 255 + (true ? 1 : 0)255 + [1, 2, 3][0] 这样的表达式等价于直接使用字面量 256,但实际上它们在类型 uint8 内计算,可能会发生溢出。

任何可以应用于整数的运算符也可以应用于数字字面量表达式,只要操作数是整数。如果其中任何一个是小数,则不允许使用位运算,并且如果指数是小数,则不允许使用指数运算(因为这可能导致非有理数)。

对于字面量数字作为左操作数(或基数)和整数类型作为右操作数(指数)的移位和指数运算,总是使用 uint256(对于非负字面量)或 int256

猜你喜欢

转载自blog.csdn.net/2301_77485708/article/details/146724354
今日推荐