堅牢性-変換

Solidityにより、暗黙的および明示的な変換が可能になります。Solidityコンパイラーでは、暗黙的な変換が不可能であり、情報が失われない限り、2つのデータ型間の暗黙的な変換が可能です。たとえば、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

切り捨てが必要ない場合は、16進数を任意の整数型に割り当てることができます。

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