Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

  1. トップページ
  2. Rust辞典
  3. as キャスト / 数値型の変換

as キャスト / 数値型の変換

Rustでプリミティブ型の間でキャストを行うには『as』キーワードを使います。整数・浮動小数点・ポインタ型などの間で変換でき、暗黙の型変換がないRustでは明示的なキャストが必要です。

構文
// 整数間のキャスト
let x: i32 = 42;
let y: i64 = x as i64;     // 小→大(安全)
let z: i8  = x as i8;      // 大→小(切り詰め)

// 整数 ↔ 浮動小数点
let f: f64 = 3.99;
let n: i32 = f as i32;     // 小数点以下を切り捨て(3)
let f2: f64 = n as f64;    // 整数を浮動小数点に変換

// 符号付き ↔ 符号なし
let u: u8 = 200;
let s: i8 = u as i8;       // ビットパターンそのまま(-56)

// usize / isize への変換
let idx: usize = 5usize;
let val: i32 = idx as i32;

// char ↔ u32
let c: char = 'A';
let n: u32 = c as u32;     // 65
let c2: char = char::from(65u8);  // 'A'
キャスト動作一覧
変換動作
小さい整数型 → 大きい整数型符号拡張(符号付き)またはゼロ拡張(符号なし)されます。
大きい整数型 → 小さい整数型上位ビットが切り捨てられます(ラップアラウンド)。
f64/f32 → 整数型小数点以下を切り捨てます。範囲外は飽和処理(Rust 1.45以降)されます。
整数型 → f64/f32近似値に変換します。精度が失われることがあります。
符号付き → 符号なしビットパターンはそのまま。負数は大きな正数になります。
as_対応メソッドu32::checked_cast / TryFrom で安全に変換できます。
サンプルコード
fn main() {
    // 整数の拡張キャスト(安全)
    let small: i32 = 1000;
    let large: i64 = small as i64;
    println!("i32 → i64: {}", large);  // 1000

    // 整数の切り詰めキャスト(上位ビット切り捨て)
    let big: i32 = 300;
    let byte: u8 = big as u8;  // 300 % 256 = 44
    println!("300 as u8: {}", byte);  // 44

    // 負数の符号なし変換
    let neg: i32 = -1;
    let u: u32 = neg as u32;  // ビットパターンそのまま
    println!("-1 as u32: {}", u);  // 4294967295

    // f64 → 整数(切り捨て)
    let f = 3.99_f64;
    let n = f as i32;
    println!("3.99 as i32: {}", n);  // 3(切り捨て)

    let f2 = -3.99_f64;
    let n2 = f2 as i32;
    println!("-3.99 as i32: {}", n2);  // -3(ゼロ方向へ切り捨て)

    // 範囲外の f64 → i32(Rust 1.45以降は飽和)
    let big_f = 1_000_000.0_f64;
    let clamped = big_f as i8;  // i8 の最大値 127 に飽和します。
    println!("1000000.0 as i8: {}", clamped);  // 127

    // char → 数値
    let c = 'A';
    let code = c as u32;
    println!("'A' as u32: {}", code);  // 65

    // 安全なキャスト(TryFrom を使います)
    use std::convert::TryFrom;
    let big_num: i64 = 1000;
    match i8::try_from(big_num) {
        Ok(n) => println!("変換成功: {}", n),
        Err(e) => println!("変換失敗: {}", e),  // out of range
    }

    // usize の使用(配列インデックスなど)
    let idx: i32 = 2;
    let arr = [10, 20, 30, 40, 50];
    println!("arr[{}] = {}", idx, arr[idx as usize]);  // 30
}
概要

Rustの『as』キャストは明示的なキャストを要求することで意図しない型変換を防ぎます。ただし『as』は失敗しません。大きな型から小さな型への変換は切り詰めが発生するため、意図した値になるか確認が必要です。

安全に変換したい場合は『TryFrom』トレイトと『try_from()』メソッドを使ってください。変換が成功すれば『Ok(値)』、失敗すれば『Err(エラー)』が返ります。

注意: f64/f32 から整数への変換は四捨五入ではなく切り捨て(ゼロ方向)です。型変換トレイトの詳細はFrom / Into / TryFrom / TryInto トレイトを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。