Solidity - 类型转换



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

固定大小字节与整数之间的转换只有在两者大小相同时才可能。

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
广告