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) |
---|---|---|---|
i32 | 32 | 符号あり | -2,147,483,648 〜 2,147,483,647 |
u32 | 32 | 符号なし | 0 〜 4,294,967,295 |
usize | 実行環境依存(32 or 64) | 符号なし | 0 〜 実行環境による |
上記のようなコードでは負の数値を扱うことがわかっているのであればi32などを利用すれば問題なく扱えることになります
最後に
Rustは安全性を重視する言語なので、アンダーフローやオーバーフローは即座にエラーになります。この「attempt to subtract with overflow」エラーは、符号なし型での引き算が主な原因です。
これまで動的型付け言語ばかり使っていたのでこの辺りが意識できていなかったです、これを気にしっかり勉強しなおそうと思います
コメント