この章のテーマ §
整数型(byte/int/long/sbyte/nint/nuint/uint/ulong/short/ushort型)についての基礎を学びます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, メソッドの基礎, (typeof演算子、ジェネリック)
※ typeof演算子、ジェネリックについてはサンプルソースで使用しているだけで、特に必須ではない。
解説 §
C#には、整数を扱う型が多く存在します。
しかし、整数は一種類ではないでしょうか。
整数とは、大ざっぱに言えば【小数でも分数でもない数】であり、一種類しかあり得ません。
ですが、整数は数が多く無限大まで上限というものがありません。
これでは、効率良くコンピュータで扱えません。
そこで、便宜上、様々な最大値と最小値を定義した型を用意して、これを使い分けています。
最も幅が狭いものはsbyte型などで、sbyte型なら127~-128を扱えます。最も幅が広いものはlong型などで、long型なら9223372036854775807~-9223372036854775808を扱えます。
一般的に表現できる範囲が狭い方がより省メモリで高速に処理できます。
扱う値が1個だけならどれを使っても大差ありませんが、巨大な配列を確保する場合にはデータ型の選び方で性能に差が出る場合もあります。
「このプログラムでは最大いくつまで値が使われるか」を見切って、それに必要な最小限度の表現力を持った型を選ぶのがプログラマーの腕前です。
罠の数々 §
- 整数型には、大きく分けると符号付きと符号なしがある。符号なしはマイナスという概念がない。最小値は常に0である
- C#の整数型には、C#の言語使用で決められたintなどの名前と、.NET側で決められた本名が存在する。どちらを使ってもプログラムは書けるが、たいていは短い方を使う。しかし、他言語との相互運用では本名を意識する
- nintとnuintは特殊な型で、32bit環境ではint/uint型と同じ表現力、64bit環境だとlong/ulong型と同じ表現力になる。使い道が特殊なのでビギナーは「そういう型もある」とだけ理解するだけで良く、無理に使わなくてもよい。サンプルソースの実行例は64bit環境で行ったもので、32bit環境だと違う値になる
- char型は数値と文字の双方の性質を持った特殊な型である。表現力はushort型と同じなので、特に整数のためにchar型を使う意味はない。
参考リンク §
整数数値型 (C# リファレンス)
サンプルソース: integerTypes §
sub<sbyte>("sbyte", sbyte.MaxValue, sbyte.MinValue);
sub<short>("short", short.MaxValue, short.MinValue);
sub<int>("int", int.MaxValue, int.MinValue);
sub<nint>("nint", nint.MaxValue, nint.MinValue);
sub<long>("long", long.MaxValue, long.MinValue);
sub<byte>("byte", byte.MaxValue, byte.MinValue);
sub<ushort>("ushort", ushort.MaxValue, ushort.MinValue);
sub<uint>("uint", uint.MaxValue, uint.MinValue);
sub<nuint>("nuint", nuint.MaxValue, nuint.MinValue);
sub<ulong>("ulong", ulong.MaxValue, ulong.MinValue);
static void sub<T>(string name, T max, T min) => Console.WriteLine($"名前:{name,-10} 本名:{typeof(T).FullName,-14} 最大値:{max,22} 最小値:{min,22}");
実行結果 §
名前:sbyte 本名:System.SByte 最大値: 127 最小値: -128
名前:short 本名:System.Int16 最大値: 32767 最小値: -32768
名前:int 本名:System.Int32 最大値: 2147483647 最小値: -2147483648
名前:nint 本名:System.IntPtr 最大値: 9223372036854775807 最小値: -9223372036854775808
名前:long 本名:System.Int64 最大値: 9223372036854775807 最小値: -9223372036854775808
名前:byte 本名:System.Byte 最大値: 255 最小値: 0
名前:ushort 本名:System.UInt16 最大値: 65535 最小値: 0
名前:uint 本名:System.UInt32 最大値: 4294967295 最小値: 0
名前:nuint 本名:System.UIntPtr 最大値: 18446744073709551615 最小値: 0
名前:ulong 本名:System.UInt64 最大値: 18446744073709551615 最小値: 0
※ これは64bit環境での実行結果である。32bit環境ならnint/nuintの最大値/最小値が異なる。
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。なお、1と2はどちらもint型の整数である。
Console.WriteLine(1 / 2);
- 0
- 0.5
- 1
- 2
- 整数は小数点以下を表現できないというエラーになる
[[解答]]