attempt to subtract with overflow – Rustの型について復習する

thread 'main' panicked at 'attempt to subtract with overflow'

Rustでプログラムを書いていたときに上記のエラーが発生しました

初歩的なミスでしたが、この記事で備忘として残しておきます

「attempt to subtract with overflow」エラーの意味とは?

このエラーは簡単に言うと、

引き算をした結果が型の下限を下回ってしまった(アンダーフローした)

という意味です。

たとえば、次のようなコードはエラーになります:

fn main() {
    let a: usize = 0;
    let b = a - 1; // ここで panic!
    println!("{}", b);
}

usizeの最小値は 0。そこから 1 を引こうとすると負の数になりますが、usize符号なし整数(非負の整数)なので、マイナスは表現できません。このため、コンパイルは通るけれど実行時にパニックします。

Rustの整数型とその違い

Rustには以下のような整数型があります

ビット数符号の有無範囲例(32bit)
i3232符号あり-2,147,483,648 〜 2,147,483,647
u3232符号なし0 〜 4,294,967,295
usize実行環境依存(32 or 64)符号なし0 〜 実行環境による

上記のようなコードでは負の数値を扱うことがわかっているのであればi32などを利用すれば問題なく扱えることになります

最後に

Rustは安全性を重視する言語なので、アンダーフローやオーバーフローは即座にエラーになります。この「attempt to subtract with overflow」エラーは、符号なし型での引き算が主な原因です。

これまで動的型付け言語ばかり使っていたのでこの辺りが意識できていなかったです、これを気にしっかり勉強しなおそうと思います

コメント

タイトルとURLをコピーしました