Solidez - Conversiones

La solidez permite la conversión tanto implícita como explícita. El compilador de solidez permite la conversión implícita entre dos tipos de datos siempre que no sea posible una conversión implícita y no haya pérdida de información. Por ejemplo, uint8 es convertible a uint16 pero int8 es convertible a uint256 ya que int8 puede contener un valor negativo no permitido en uint256.

Conversión explícita

Podemos convertir explícitamente un tipo de datos en otro usando la sintaxis del constructor.

int8 y = -3;
uint x = uint(y);
//Now x = 0xfffff..fd == two complement representation of -3 in 256 bit format.

La conversión a tipos más pequeños cuesta bits de orden superior.

uint32 a = 0x12345678;
uint16 b = uint16(a); // b = 0x5678

La conversión a un tipo superior agrega bits de relleno a la izquierda.

uint16 a = 0x1234;
uint32 b = uint32(a); // b = 0x00001234

La conversión a bytes más pequeños cuesta datos de orden superior.

bytes2 a = 0x1234;
bytes1 b = bytes1(a); // b = 0x12

La conversión a un byte más grande agrega bits de relleno a la derecha.

bytes2 a = 0x1234;
bytes4 b = bytes4(a); // b = 0x12340000

La conversión entre bytes de tamaño fijo e int solo es posible cuando ambos son del mismo tamaño.

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

Los números hexadecimales se pueden asignar a cualquier tipo de entero si no se necesita truncamiento.

uint8 a = 12; // no error
uint32 b = 1234; // no error
uint16 c = 0x123456; // error, as truncation required to 0x3456