1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rustで255 as i8をすると?

Posted at

ちまちまと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進数とかあまり理解できていないと思ったので、何時かの機会に理解を深めていきたいですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?