📅  最后修改于: 2020-11-04 04:23:37             🧑  作者: Mango
Solidity允许隐式和显式转换。 Solidity编译器允许在两种数据类型之间进行隐式转换,前提是不可能进行隐式转换并且不丢失任何信息。例如,uint8可转换为uint16,而int8可转换为uint256,因为int8可以包含uint256不允许的负值。
我们可以使用构造函数语法将数据类型显式转换为另一种。
int8 y = -3;
uint x = uint(y);
//Now x = 0xfffff..fd == two complement representation of -3 in 256 bit format.
转换为较小的类型需要花费较高的位。
uint32 a = 0x12345678;
uint16 b = uint16(a); // b = 0x5678
转换为更高类型的字符会在左侧添加填充位。
uint16 a = 0x1234;
uint32 b = uint32(a); // b = 0x00001234
转换为较小的字节会消耗较高顺序的数据。
bytes2 a = 0x1234;
bytes1 b = bytes1(a); // b = 0x12
转换为较大字节后,在右侧添加填充位。
bytes2 a = 0x1234;
bytes4 b = bytes4(a); // b = 0x12340000
固定大小的字节和int之间的转换仅在大小相同时才可以进行。
bytes2 a = 0x1234;
uint32 b = uint16(a); // b = 0x00001234
uint32 c = uint32(bytes4(a)); // c = 0x12340000
uint8 d = uint8(uint16(a)); // d = 0x34
uint8 e = uint8(bytes1(a)); // e = 0x12
如果不需要截断,可以将十六进制数分配给任何整数类型。
uint8 a = 12; // no error
uint32 b = 1234; // no error
uint16 c = 0x123456; // error, as truncation required to 0x3456