Solidità - Conversioni

La solidità consente la conversione implicita oltre che esplicita. Il compilatore Solidity consente la conversione implicita tra due tipi di dati a condizione che non sia possibile alcuna conversione implicita e che non vi sia perdita di informazioni. Ad esempio, uint8 è convertibile in uint16 ma int8 è convertibile in uint256 poiché int8 può contenere un valore negativo non consentito in uint256.

Conversione esplicita

Possiamo convertire in modo esplicito un tipo di dati in un altro utilizzando la sintassi del costruttore.

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

La conversione al tipo più piccolo costa bit di ordine superiore.

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

La conversione al tipo più alto aggiunge bit di riempimento a sinistra.

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

La conversione in byte più piccoli costa dati di ordine superiore.

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

La conversione in byte più grandi aggiunge bit di riempimento a destra.

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

La conversione tra byte di dimensione fissa e int è possibile solo quando entrambi hanno la stessa dimensione.

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

I numeri esadecimali possono essere assegnati a qualsiasi tipo di numero intero se non è necessario il troncamento.

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