🦔

Rust のデータ型の上限・下限の扱い方とその応用

2024/09/12に公開

はじめに

Rustには様々なデータ型が存在しますが、u8u16あるいは i32のように上限値と下限値がわからなくなることはないでしょうか。僕はめちゃくちゃあります。

いちいち調べるのも面倒なのでどうせならコード上で確認したい!そんな場合に有効な方法を簡単ですが紹介します。

u8::MAX, i32::MIN のように指定する

u8i32などの数値系型の上限値、下限値には MAXMINを指定することが可能です。
これにより、上限値や下限値を簡単に知ることができます。

fn main() {
    println!("型: u8   下限値: {}   上限値: {}", u8::MIN, u8::MAX);
    println!("型: i8   下限値: {}   上限値: {}", i8::MIN, i8::MAX);
    println!("型: u16  下限値: {}   上限値: {}", u16::MIN, u16::MAX);
    println!("型: i16  下限値: {}   上限値: {}", i16::MIN, i16::MAX);
    println!("型: u32  下限値: {}   上限値: {}", u32::MIN, u32::MAX);
    println!("型: i32  下限値: {}   上限値: {}", i32::MIN, i32::MAX);
    println!("型: u64  下限値: {}   上限値: {}", u64::MIN, u64::MAX);
    println!("型: i64  下限値: {}   上限値: {}", i64::MIN, i64::MAX);
    println!("型: usize 下限値: {}  上限値: {}", usize::MIN, usize::MAX);
    println!("型: isize 下限値: {}  上限値: {}", isize::MIN, isize::MAX);
    println!("型: f32  下限値: {}   上限値: {}", f32::MIN, f32::MAX);
    println!("型: f64  下限値: {}   上限値: {}", f64::MIN, f64::MAX);
}

これらを実行して出力すると以下のようになります。

型: u8   下限値: 0   上限値: 255
型: i8   下限値: -128   上限値: 127
型: u16  下限値: 0   上限値: 65535
型: i16  下限値: -32768   上限値: 32767
型: u32  下限値: 0   上限値: 4294967295
型: i32  下限値: -2147483648   上限値: 2147483647
型: u64  下限値: 0   上限値: 18446744073709551615
型: i64  下限値: -9223372036854775808   上限値: 9223372036854775807
型: usize 下限値: 0  上限値: 18446744073709551615
型: isize 下限値: -9223372036854775808  上限値: 9223372036854775807
型: f32  下限値: -340282350000000000000000000000000000000   上限値: 340282350000000000000000000000000000000
型: f64  下限値: -179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000   上限値: 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

このようにざっと出力することができます。

RESTAPI やコマンドライン引数で受け取った値を判定する

単純に出力するだけならあまりユースケースとして物足りないと思いますが、
Rust で RESTAPI やコマンドライン引数を使って、上限値、下限値に達しているかどうか調べたいときにも有効かと思います。

以下の例はコマンドライン引数で値を引き受けた場合です。

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    let input = &args[1];
    match input.parse::<u32>() {
        Ok(value) => {
            if value <= u8::MAX.into() {
                println!("値 {} は u8 の範囲内です。", value);
            } else {
                println!("値 {} は u8 の範囲を超えています。", value);
            }
        }
        Err(_) => println!("入力が無効です。"),
    }
}

値を受け取って、それが妥当な数値であるかを判別するには、このように条件分岐を加えることができます。

おわりに

条件分岐で 上限値チェックをしたい場合、
if num < 255 {} の書き方ではなく、if num < u8::MAX {} のような書き方の方が個人的にはスマートで好きです。

ではでは!

コラボスタイル Developers

Discussion