Solidityのドキュメントのここに書いてある内容について、Rustも同じ仕様なのか?などを試してみました。
マイナスのintをuintに変換する
let a:i8 = -3;
println!("a:{}", a as u8);
結果
a:253
Solidityと同じ結果でした。256を足すと答えが出るみたいになってる。
u32をu16に変換する
let b:u32 = 0x12345678;
let c:u16 = b as u16;
println!("b:{}({:#x?}) -> c:{}({:#x?})", b ,b, c, c);
結果
b:305419896(0x12345678) -> c:22136(0x5678)
Solidityと同じ結果でした。
u16をu32に変換する
let d:u16 = 0x1234;
let e:u32 = d as u32;
let f:u32 = 0x00001234;
println!("u16:{:#x?} u32:{:#x?} u32:{:#x?}", d, e, f);
結果
u16:0x1234 u32:0x1234 u32:0x1234
Solidityと同じ結果ってことかなと思いました。器が大きくなっただけなので、値自体は全く変わっていない、と認識しました。
bytes2からbytes1にする
int, uintの場合は、容量を減らすと大きい数値がなくなり小さい方が残りますが、byte列の場合は、大きい方が残ると認識しました。
Rustには、bytes2とかbytes1といった型は標準では多分なく、[u8; 2]みたいなu8型の配列やvectorで表すのかなと思います。下記は上記のSolidityの仕様と同じになるように、Rustでやってみたものです。
let g: u32 = 0x04030201;
let h: [u8; 4] = g.to_be_bytes();
let mut i: [u8; 2] = [0; 2];
i.clone_from_slice(&h[..2]);
let k: u16 = u16::from_be_bytes(i);
println!("{}({:#x?}) -> {:?} -> {}({:#x?})", g, g, h, k, k);
結果
67305985(0x4030201) -> [4, 3, 2, 1] -> 1027(0x403)
Top comments (0)