【Rust入門】キャスト、強制的な型変換

前回は数字のリテラルについてやりました。
今回は強制的な型変換、キャストについてです。

キャスト、強制的な型変換

Rustは基本的に型が違う変数に値を入れることができません。
しかし、プログラムでは時として変数の値を違う型の変数に渡したい時があります。
そのような時はキャストを使います。

キャストの書き方

以下がキャストの方法です。

fn main() {
	let value1 : u32 = 100;
	let value2 : u8;

	value2 = value1 as u8;
	println!("value2 = {}", value2);
}

実行結果は以下の通りです。

value2 = 100

5行目がキャストになります。
強制的に型変換をする時は「as」を使い、後ろに変換する型を書きます。
このようにすればu32型をu8型の値を入れることができます。

変数の上限値に注意

キャストをする時は変数の上限値に注意が必要です。
以下のようにu32型をu8型にキャストすると、u8型の上限値を超えてしまう可能性があります。

fn main() {
	let value1 : u32 = 300;
	let value2 : u8;

	value2 = value1 as u8;
	println!("value2 = {}", value2);
}

実行結果は以下の通りです。

value2 = 44

u8型は1バイト(8ビット)の変数なので上限値は 0 ~ 255 までしか表現できません。
u32型は300を表現できますが、u8型にキャストしてしまうと上限値を超えてしまいます。
そのため、望む結果にならない可能性があります。

上の例の場合、8bitを超えた分は切り捨てられます。
具体的には二進数で表すとわかると思います。

u32 : 0001 0010 1100 → 300
u8  :      0010 1100 → 44

u32と比べて4bit分が消えるので結果は44になります。

小数から整数へのキャスト

整数を小数に入れることができるのは想像できると思いますが、小数から整数にキャストして代入するとどうなるでしょうか?

例えばこのように書きます。

fn main() {
	let value1 : f64 = 35.0058;
	let value2 : u8;

	value2 = value1 as u8;

	println!("value2 = {}", value2);
}

結果はこのようになります。

value2 = 35

小数点以下が消えてしまいました。
このように小数から整数にキャストする時は注意が必要です。

小数の桁を保持してキャストする方法

特定の桁の小数を保持したままキャストをしたい時は、掛け算を使って保持するという方法があります。

fn main() {
	let value1 : f64 = 35.0058;
	let value2 : u32;

	value2 = (value1 * 10_000.0f64) as u32;

	println!("value2 = {}", value2);
}

例えば、小数点第4位までを保持するとこうなります。

「*」が掛け算の記号なのですが、このように掛け算をした後にキャストすると擬似的に小数点を保持することができます。
後ほど小数に戻す時は、f64型にキャストして、さらに指定の数値で割れば元に戻ります。
割り算は「/」を使って行います。

fn main() {
	let value1 : f64 = 35.0058;
	let value2 : u32;

	value2 = (value1 * 10_000.0f64) as u32;

	println!("value2 = {}", (value2 as f64) / 10_000.0f64 );
}

実行結果は以下の通りです。

value2 = 35.0058

ただし、小数点第4位より下の情報は全て消えてしまうので注意してください。

スポンサーリンク