ちまちまと100 Exercises To Learn Rustに取り組んでいて、よくわからないところがあったので、メモ。
255 as i8すると?
エクササイズの中で、
#[allow(overflowing_literals)]
let x = { 255 as i8 };
xには何が入るのかといった問題があり、これがよくわからなかった。
#[allow(overflowing_literals)]について
#[allow(overflowing_literals)]
は、オーバーフローする際の警告を無視するもの。
もし、上記を書かないと
error: literal out of range for `i8`
--> src/main.rs:2:15
|
2 | let x = { 255 as i8 };
| ^^^
|
= note: the literal `255` does not fit into the type `i8` whose range is `-128..=127`
= help: consider using the type `u8` instead
= note: `#[deny(overflowing_literals)]` on by default
のようなエラーが発生する。
xには-1が入る
xには-1が入るらしい。
i8の範囲は-128~127
なので、型変換しようとしている255
は範囲外。
なので、異なる数字になるのは理解できるけれど、なぜ-1なんだろう。
わからなかったので、chat-gptに質問してみると、
このコードを実行すると、xの値は-1になります。これは、i8の最大値を超えた場合にラップアラウンドが発生するためです。
とのこと。
ラップアラウンドとは、範囲を超えたときに、最小値から始まる現象。
(最小値より下回ったときは最大値から。最大値より上回ったときは最小値から。)
255 - 127 = 128だから、0ではないの?と次は思った。
どうやら、255を2進数表すと、11111111
となり、i8として解釈されると、符号ビットが1になるため、負の数として扱われる。
なので、-1になるっぽい。
終わり
2進数とかあまり理解できていないと思ったので、何時かの機会に理解を深めていきたいですね。