Solidität - Umrechnungen
Solidity ermöglicht sowohl implizite als auch explizite Konvertierung. Der Solidity-Compiler ermöglicht die implizite Konvertierung zwischen zwei Datentypen, sofern keine implizite Konvertierung möglich ist und keine Informationen verloren gehen. Zum Beispiel ist uint8 in uint16 konvertierbar, aber int8 ist in uint256 konvertierbar, da int8 einen negativen Wert enthalten kann, der in uint256 nicht zulässig ist.
Explizite Konvertierung
Wir können einen Datentyp mithilfe der Konstruktorsyntax explizit in einen anderen konvertieren.
int8 y = -3;
uint x = uint(y);
//Now x = 0xfffff..fd == two complement representation of -3 in 256 bit format.
Die Konvertierung in einen kleineren Typ kostet Bits höherer Ordnung.
uint32 a = 0x12345678;
uint16 b = uint16(a); // b = 0x5678
Bei der Konvertierung in einen höheren Typ werden links Füllbits hinzugefügt.
uint16 a = 0x1234;
uint32 b = uint32(a); // b = 0x00001234
Die Konvertierung in kleinere Bytes kostet Daten höherer Ordnung.
bytes2 a = 0x1234;
bytes1 b = bytes1(a); // b = 0x12
Bei der Konvertierung in ein größeres Byte werden rechts Füllbits hinzugefügt.
bytes2 a = 0x1234;
bytes4 b = bytes4(a); // b = 0x12340000
Die Konvertierung zwischen Bytes fester Größe und int ist nur möglich, wenn beide dieselbe Größe haben.
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
Hexadezimalzahlen können jedem Ganzzahltyp zugewiesen werden, wenn keine Kürzung erforderlich ist.
uint8 a = 12; // no error
uint32 b = 1234; // no error
uint16 c = 0x123456; // error, as truncation required to 0x3456