Skip to content

整数型

ビット幅範囲ビット幅の取得最小値の取得最大値の取得
u88ビット0 から 28 - 1u8::BITSu8::MINu8::MAX
u1616ビット0 から 216 - 1u16::BITSu16::MINu16::MAX
u3232ビット0 から 232 - 1u32::BITSu32::MINu32::MAX
u6464ビット0 から 264 - 1u64::BITSu64::MINu64::MAX
u128128ビット0 から 2128 - 1u128::BITSu128::MINu128::MAX
usize計算機のワード長0 から 232 - 1、 もしくは 0 から 264 - 1usize::BITSusize::MINusize::MAX
unsigned-integer-type/main.rs
fn main() {
println!(" u8のビット幅:{:>4}、最小値:{:>2}、最大値:{:>40}", u8::BITS, u8::MIN, u8::MAX);
println!(" u16のビット幅:{:>4}、最小値:{:>2}、最大値:{:>40}", u16::BITS, u16::MIN, u16::MAX);
println!(" u32のビット幅:{:>4}、最小値:{:>2}、最大値:{:>40}", u32::BITS, u32::MIN, u32::MAX);
println!(" u64のビット幅:{:>4}、最小値:{:>2}、最大値:{:>40}", u64::BITS, u64::MIN, u64::MAX);
println!(" u128のビット幅:{:>4}、最小値:{:>2}、最大値:{:>40}", u128::BITS, u128::MIN, u128::MAX);
println!("usizeのビット幅:{:>4}、最小値:{:>2}、最大値:{:>40}", usize::BITS, usize::MIN, usize::MAX);
}
実行結果
u8のビット幅: 8、最小値: 0、最大値: 255
u16のビット幅: 16、最小値: 0、最大値: 65535
u32のビット幅: 32、最小値: 0、最大値: 4294967295
u64のビット幅: 64、最小値: 0、最大値: 18446744073709551615
u128のビット幅: 128、最小値: 0、最大値: 340282366920938463463374607431768211455
usizeのビット幅: 64、最小値: 0、最大値: 18446744073709551615
ビット幅 範囲ビット幅の取得最小値の取得最大値の取得
i88ビット  - 27 から 27 - 1i8::BITSi8::MINi8::MAX
i1616ビット- 215 から 215 - 1i16::BITSi16::MINi16::MAX
i3232ビット- 231 から 231 - 1i32::BITSi32::MINi32::MAX
i6464ビット- 263 から 263 - 1i64::BITSi64::MINi64::MAX
i128128ビット- 2127 から 2127 - 1i128::BITSi128::MINi128::MAX
isize計算機のワード長- 231 から 231 - 1、 もしくは - 263 から 264 - 1isize::BITSisize::MINisize::MAX
signed-integer-type/main.rs
fn main() {
println!(" i8のビット幅:{:>4}、最小値:{:>41}、最大値:{:>40}", i8::BITS, i8::MIN, i8::MAX);
println!(" i16のビット幅:{:>4}、最小値:{:>41}、最大値:{:>40}", i16::BITS, i16::MIN, i16::MAX);
println!(" i32のビット幅:{:>4}、最小値:{:>41}、最大値:{:>40}", i32::BITS, i32::MIN, i32::MAX);
println!(" i64のビット幅:{:>4}、最小値:{:>41}、最大値:{:>40}", i64::BITS, i64::MIN, i64::MAX);
println!(" i128のビット幅:{:>4}、最小値:{:>41}、最大値:{:>40}", i128::BITS, i128::MIN, i128::MAX);
println!("isizeのビット幅:{:>4}、最小値:{:>41}、最大値:{:>40}", isize::BITS, isize::MIN, isize::MAX);
}
実行結果
i8のビット幅: 8、最小値: -128、最大値: 127
i16のビット幅: 16、最小値: -32768、最大値: 32767
i32のビット幅: 32、最小値: -2147483648、最大値: 2147483647
i64のビット幅: 64、最小値: -9223372036854775808、最大値: 9223372036854775807
i128のビット幅: 128、最小値: -170141183460469231731687303715884105728、最大値: 170141183460469231731687303715884105727
isizeのビット幅: 64、最小値: -9223372036854775808、最大値: 9223372036854775807

整数リテラルには数値の後ろに型を付ける。38u8はu8の値、4953isizeはisizeになる。また、0x、0o、0bを先頭に付けると、16進数、8進数、2進数のリテラルになる。

リテラル10進数
52i8i852
0xcafeu32u3251966
0b0001_0100推論される20
0o105推論される69
integer-literal/main.rs
fn main() {
println!("{}", 52i8);
println!("{}", 0xcafeu32);
println!("{}", 0b0001_0100);
println!("{}", 0o105);
}
実行結果
52
51966
20
69

バイトリテラルb’X’は文字Xに対するACSIIコードのu8の値となる。 バイトリテラルはb’\xHH’のように16進数で書くこともできる。HHは値を表す16進数2文字である。

文字バイトリテラルバイトリテラル(16進表記)対応する数値リテラル
英小文字ab’a’b’\x61’97u8
英小文字bb’b’b’\x62’98u8
英小文字cb’c’b’\x63’99u8
英大文字Ab’A’b’\x41’65u8
英大文字Bb’B’b’\x42’66u8
英大文字Cb’C’b’\x43’67u8
シングルクォート’b” ‘b’\x27’39u8
バックスラッシュ\b’\‘b’\x5C’92u8
改行b’\n’b’\x0A’10u8
byte-literal/main.rs
fn main() {
println!("{},{},{}", b'a' , b'b' , b'c' );
println!("{},{},{}", b'A' , b'B' , b'C' );
println!("{},{},{}", b'\'' , b'\\' , b'\n' );
println!("{},{},{}", b'\x61', b'\x62', b'\x63');
println!("{},{},{}", b'\x41', b'\x42', b'\x43');
println!("{},{},{}", b'\x27', b'\x5C', b'\x0A');
}
実行結果
97,98,99
65,66,67
39,92,10
97,98,99
65,66,67
39,92,10

計算結果が その型で表現できる範囲を超えるかどうかを安全に確認しながら演算する ためのものです。 計算できるなら Some(値)、できないなら None を返す。

// u8::MAX - 1に1を足すとu8::MAXとなりオーバーフローは発生しないのでSome(u8::MAX)が返ります。
assert_eq!((u8::MAX - 1).checked_add(1), Some(u8::MAX));
// u8::MAX - 1に2を足すとu8::MAX + 1となりオーバーフローが発生するのでNoneが返ります。
assert_eq!((u8::MAX - 1).checked_add(2), None);
// u8::MIN - 1から1を引くとu8::MINとなりオーバーフローは発生しないのでSome(u8::MIN)が返ります。
assert_eq!((u8::MIN + 1).checked_sub(1), Some(u8::MIN));
// u8::MIN - 1から2を引くとu8::MIN - 1となりオーバーフローが発生するのでNoneが返ります。
assert_eq!((u8::MIN + 1).checked_sub(2), None);
// u8::MAXに1をかけるとu8::MAXとなりオーバーフローは発生しないのでSome(u8::MAX)が返ります。
assert_eq!((u8::MAX).checked_mul(1), Some(u8::MAX));
// u8::MAXに2をかけるとu8::MAX * 2となりオーバーフローが発生するのでNoneが返ります。
assert_eq!((u8::MAX).checked_mul(2), None);
// 128u8を2で割ると64となりオーバーフローは発生しないので64が返ります。
assert_eq!(128u8.checked_div(2), Some(64u8));
// 0での除算はNoneが返ります。
assert_eq!(1u8.checked_div(0), None);

ラッピング演算 は、整数の範囲を超えたときにエラーにせず、ビット幅に収まるように値を循環させる演算です。

計算結果が型の範囲を超えたとき、循環させずに 最小値または最大値で止める演算 です。 日本語では「 飽和演算 」と呼ばれることがあります。

計算結果そのものと、オーバーフローが起きたかどうかをセットで返す演算です。

項目checked_*wrapping_*saturating_*overflowing_*
範囲超過時None循環端で止まる (結果, true)
戻り値Option<T>TT(T, bool)
結果値の扱い失敗として捨てるそのまま使う端値に丸める使いつつ検出できる
主な用途厳密な計算低レベル処理上限下限のある値フラグ付き演算