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
Преобразование между байтами фиксированного размера и 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