Solidity是一种静态类型语言,这意味着需要指定每个变量(状态和本地)的类型。Solidity提供了几种基本类型,可以组合形成复杂类型。
此外,类型可以在包含运算符的表达式中相互交互。有关各种运算符的快速参考,请参阅运算符的优先顺序。
值类型
以下类型也称为值类型,因为这些类型的变量将始终按值传递,即它们在用作函数参数或赋值时始终被复制。
布尔
bool
:可能的值是常量true
和false
。
运营商:
!
(逻辑否定)&&
(逻辑连词,“和”)||
(逻辑分离,“或”)==
(平等)!=
(不等式)
整数
int
/ uint
:各种大小的有符号和无符号整数。关键字uint8
以uint256
在步骤8
(无符号的8到256位)和int8
到int256
。uint
和int
是别名uint256
和int256
分别。
运营商:
- 比较:
<=
,<
,==
,!=
,>=
,>
(计算结果为bool
) - 位运算符:
&
,|
,^
(按位异或),~
(按位取反) - 换班操作员:(
<<
左移),>>
(右移) - 算术运算符:
+
,-
,一元-
,*
,/
,%
(模),**
(幂)
比较
比较的值是通过比较整数值获得的值。
位操作
位操作是在数字的二进制补码表示上执行的。这意味着,例如。~int256(0) == int256(-1)
转移
移位操作的结果具有左操作数的类型。表达式相当于,对于正整数, 等价于。对于负数, 相当于将四舍五入的幂除以(向负无穷大)。按负数移动会引发运行时异常。x << y
x * 2**y
x >> y
x / 2**y
x
x >> y
2
警告
版本之前0.5.0
右移负等同于,用于向零舍入,而不是向负无穷舍即右移。x >> y
x
x / 2**y
加法,减法和乘法
加法,减法和乘法具有通常的语义。它们用二进制补码表示,例如。在设计安全的智能合约时,您必须考虑这些溢出。uint256(0) - uint256(1) == 2**256 - 1
表达式-x
等同于where 的类型。这意味着如果类型是无符号整数类型,则不会为负数。此外,如果是否定的,可以是积极的。还有另一个警告也是由两个补码表示:(T(0) - x)
T
x
-x
x
-x
x
int x = -2**255;
assert(-x == x);
这意味着即使数字为负数,也不能假设它的否定是正数。
分部
由于操作结果的类型始终是其中一个操作数的类型,因此对整数的除法总是产生整数。在Solidity中,分部向零舍入。这意味着。
int256(-5) / int256(2) == int256(-2)
请注意,相反,文字除法会产生任意精度的小数值。
注意
除以零会导致断言失败。
模数
模运算产生操作数 除以操作数后的余数,其中和。这意味着模数与左操作数(或零)产生相同的符号,并保持为负数:
a % nranq = int(a / n)r = a - (n * q)a % n == -(abs(a) % n)a
int256(5) % int256(2) == int256(1)
int256(5) % int256(-2) == int256(1)
int256(-5) % int256(2) == int256(-1)
int256(-5) % int256(-2) == int256(-1)
注意
模数为零会导致失败的断言。
指数
Exponentiation仅适用于未签名类型。请注意您使用的类型足够大以保存结果并为潜在的包装行为做好准备。
注意
请注意,0**0
由EVM定义为1
。
定点数
警告
Solidity尚未完全支持定点数。
fixed
/ ufixed
:各种大小的有符号和无符号定点数。关键字ufixedMxN
和fixedMxN
,其中M
表示类型占用的位数,N
表示可用的小数点数。M
必须可被8整除,并从8位变为256位。N
必须在0到80之间,包括0和80。 ufixed
和fixed
是别名ufixed128x18
和fixed128x18
分别。
运营商:
- 比较:
<=
,<
,==
,!=
,>=
,>
(计算结果为bool
) - 算术运算符:
+
,-
,一元-
,*
,/
,%
(模)
注意
浮点(float
和double
许多语言,更准确地说是IEEE 754数字)和定点数之间的主要区别在于,用于整数的小数位数和小数部分(小数点后面的部分)在前者中是灵活的,而后者则严格定义。通常,在浮点中,几乎整个空间用于表示数字,而只有少量位用于定义小数点的位置。
地址
地址类型有两种形式,大致相同:
address
:保存一个20字节的值(以太坊地址的大小)。address payable
:相同address
,但附加成员transfer
和send
。
这种区别背后的想法是,您可以发送以太网的地址,而平原不能发送以太网。address payable
address
输入转化次数:
从隐式转换到被允许的,而从转换至是不可能的(执行这种转换的唯一方法是通过使用中间转换)。
address payableaddressaddressaddress payableuint160
地址文字可以隐式转换为。address payable
address
对于整数,整数文字bytes20
和契约类型,允许显式转换和转换,但需要注意以下事项:不允许转换表单。相反,表单转换的结果 具有类型,如果是整数或固定字节类型,文字或具有应付回退函数的合约。如果是没有应付回退功能的合约,那么将是类型。在外部函数中,签名用于和类型。
address payable(x)address(x)address payablexxaddress(x)addressaddressaddressaddress payable
注意
这很可能是,你并不需要关心的区别address
,并与只使用无处不在。例如,如果您正在使用提款模式,您可以(并且应该)将地址本身存储为,因为您调用了该功能 ,这是一个。address payable
address
address
transfer
msg.sender
address payable
运营商:
<=
,<
,==
,!=
,>=
和>
警告
如果您将使用更大的字节大小所涉及的类型address
,例如bytes32
,然后address
被截断。要减少编译器强制转换歧义版本0.4.24及更高版本,请在转换中使截断显式化。以地址为例0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFFCCCC
。
你可以使用address(uint160(bytes20(b)))
,结果0x111122223333444455556666777788889999a