
Rustの数値型と演算子をマスターして、安全で効率的な数値計算を実現しましょう!
Rustの数値型:整数型と浮動小数点型
Rustは、多様な数値型をサポートしており、用途に応じて適切な型を選択することが重要です。数値型は大きく分けて整数型と浮動小数点型に分類できます。
整数型は、符号付き(i8, i16, i32, i64, i128, isize)と符号なし(u8, u16, u32, u64, u128, usize)があります。それぞれの数字はビット数を表し、isizeとusizeはアーキテクチャに依存するサイズを持ちます。
例えば、i32は32ビットの符号付き整数を表し、-2,147,483,648から2,147,483,647までの値を格納できます。u32は32ビットの符号なし整数で、0から4,294,967,295までの値を格納できます。
let x: i32 = 10;
let y: u32 = 20;浮動小数点型は、f32とf64があります。f32は単精度浮動小数点数、f64は倍精度浮動小数点数を表します。一般的に、f64の方が精度が高いため、特に理由がない限りf64の使用が推奨されます。
let pi: f64 = 3.14159;Rustは型推論を行うため、明示的に型を指定しなくてもコンパイラが型を推論してくれる場合があります。しかし、数値型の場合は、曖昧さを避けるために、必要に応じて型注釈を付与することが推奨されます。
Rustの基本的な算術演算子
Rustでは、他の多くのプログラミング言語と同様に、基本的な算術演算子(+, -, *, /, %)を使用できます。
let a = 10;
let b = 3;
let sum = a + b; // 加算
let difference = a - b; // 減算
let product = a * b; // 乗算
let quotient = a / b; // 除算
let remainder = a % b; // 剰余除算(/)を行う場合、整数型同士の除算は小数点以下が切り捨てられることに注意が必要です。浮動小数点数として結果を得たい場合は、どちらかのオペランドを浮動小数点型にキャストする必要があります。
let a = 10.0;
let b = 3.0;
let quotient = a / b; // 結果は3.333...また、Rustではオーバーフローやアンダーフローが発生した場合、デフォルトではパニックが発生します。しかし、wrapping_*、overflowing_*、saturating_*、checked_*といったメソッドを使用することで、挙動を制御できます。
let a: u8 = 255;
let b: u8 = 1;
let wrapping_add = a.wrapping_add(b); // オーバーフローをラップする (結果は0)
let (overflowing_add, overflowed) = a.overflowing_add(b); // オーバーフローの有無を返すビット演算子も利用可能です(&, |, ^, !, <<, >>)。
let a: u8 = 0b0000_1111;
let b: u8 = 0b0011_0011;
let bitwise_and = a & b; // AND演算
let bitwise_or = a | b; // OR演算
let bitwise_xor = a ^ b; // XOR演算
let left_shift = a << 2; // 左シフト
let right_shift = a >> 2; // 右シフトRustの複合代入演算子
Rustでは、複合代入演算子(+=, -=, *=, /=, %=)も使用できます。これにより、変数の値を更新する処理を簡潔に記述できます。
let mut x = 10;
x += 5; // x = x + 5; と同じ (xは15になる)
x *= 2; // x = x * 2; と同じ (xは30になる)数値型の変換
異なる数値型間で値を代入する場合、明示的な型変換が必要です。Rustでは、asキーワードを使用して型変換を行います。ただし、型変換によって情報が失われる可能性があるため、注意が必要です。
let x: i32 = 100;
let y: f64 = x as f64; // i32からf64への変換
let z: u8 = y as u8; // f64からu8への変換(小数点以下は切り捨てられる)fromやintoトレイトを利用することも可能です。これらは、型変換の安全性を高めるために使用できます。
impl From<i32> for f64 {
fn from(item: i32) -> Self {
item as f64
}
}
let x: i32 = 100;
let y: f64 = f64::from(x); // i32からf64への変換参考リンク
まとめ
Rustの数値型は、整数型と浮動小数点型があり、それぞれに様々なサイズが存在します。適切な型を選択し、算術演算子や複合代入演算子を使いこなすことで、効率的なコードを書くことができます。型変換を行う際は、情報損失に注意し、必要に応じてasキーワードやfrom/intoトレイトを使用しましょう。

