キャスト

Rustはプリミティブ型の暗黙的な変換(強制)を提供していません。しかし、 asキーワードで明示的な変換(キャスト)ができます。

整数型の変換に関する規則はCと基本的に同じですが、Cには未定義動作があり、 Rustはすべての型キャストがうまく定義されています。

// キャストでの桁溢れに関する警告をなくす。
#![allow(overflowing_literals)]

fn main() {
    let decimal = 65.4321_f32;

    // エラー! 暗黙的な変換はしません
    let integer: u8 = decimal;
    // FIXME ^ この行をコメントアウトしてください

    // 明示的な変換
    let integer = decimal as u8;
    let character = integer as char;

    // エラー! これは変換規則によって禁止されています。浮動小数点は文字に直接変換できません。
    let character = decimal as char;
    // FIXME ^ この行をコメントアウトしてください

    println!("Casting: {} -> {} -> {}", decimal, integer, character);

    // 値を符号なし整数型Tにキャストするときは、T::MAX + 1
    // を新しい型にフィットするように加減します。

    // 1000はu16にフィットしています。
    println!("1000 as a u16 is: {}", 1000 as u16);

    // 1000 - 256 - 256 - 256 = 232
    // 内部時には、最初の8最下位ビット(LSB)は保存され、
    // 残りの最上位ビットは切り捨てられます。
    println!("1000 as a u8 is : {}", 1000 as u8);
    // -1 + 256 = 255
    println!("  -1 as a u8 is : {}", (-1i8) as u8);

    // 正の数は、剰余と同じです。
    println!("1000 mod 256 is : {}", 1000 % 256);

    // 符号付き整数型に変換する時、(ビット処理)結果は対応する符号なし整数型への
    // キャストの結果と同じです。最上位ビットが1の時、その値は負です。

    // もちろん、これはすでにフィットしています。
    println!(" 128 as a i16 is: {}", 128 as i16);
    // 128 as u8 -> 128  これの8ビットでの2の補数は
    println!(" 128 as a i8 is : {}", 128 as i8);

    // 上の例を繰り返します。
    // 1000 as u8 -> 232
    println!("1000 as a u8 is : {}", 1000 as u8);
    // 232の2の補数は-24
    println!(" 232 as a i8 is : {}", 232 as i8);
}