2
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?

More than 5 years have passed since last update.

Rustで整数リテラルを使うときは、できるだけ型を指定した方が良さそう

Posted at

競技プログラミングを想定して書いていますが、他でもハマる可能性はあるかもしれません。

Rustのデフォルト整数型

Rustのデフォルトの整数型はi32になっているようです。

integer types default to i32

以下のコードで試してみることもできます。
print_typenameについては https://qiita.com/garkimasera/items/729dbf11dd5738c70e11 を参考にしました)

fn main() {
    let m = 0usize;
    print_typename(m);

    let n = 0;
    print_typename(n);
}

fn print_typename<T>(_: T) {
    println!("{}", std::any::type_name::<T>());
}

出力:

usize
i32

競プロの場合

32ビットの上限は、符号なしの場合で4 * 10^9程度なので、競プロで扱う数の大きさだと容易にあふれます。

さらにcargo runデバッグビルドしている場合はオーバーフローをチェックしてくれますが、リリースビルドではチェックしてくれません。
そのため以下のコードはcargo run --releaseで実行すると-2147483648を出力し、終了ステータスも0(正常終了)となります。

fn main() {
    let l = std::i32::MAX;
    println!("{}", l + 1);
}

AtCoder上の表示もREではなくWAとなります。気をつけましょう。

結論

できるだけ、変数に型アノテーションをつけるか0usizeなどとしましょう。

2
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
2
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?