この章のテーマ §
ここでは数値の書き方を学びます。数値は、型を明示することも、8進数や16進数を明示することもできます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, メソッドの基礎, 整数型, 実数型
解説 §
C#の数値には型があります。単に"123"のような数字を書いてもそれは型を持っています。
整数で特に何も書かなければint、uint、long、ulong の型のうちその値を表すことができる最初のものになります。
実数(小数点以下のある数)ならdoubleなります。
数値の後ろに文字(サフィックス)を付加すると型を強制できます。
- u/Uならuintかulong
- l/Lならlongかulong
- UL/Ul/uL/ul/LU/Lu/lU/luならulong
- d/Dならdouble
- f/Fならfloat
- m/Mならdecimal
たとえば、123はint型ですが、123fはfloat型です。
これとは別に2進数と16進数を表記する方法があります。
先頭に0xを付加すると16進数です。
先頭に0bを付加すると2進数です。
たとえば、0x10は16進数の10になりますが、0b10は2進数の10になります。
罠の数々 §
- long型やulong型を使う時には、意外とサフィックスの文字の使用頻度が低い。int型から暗黙の型変換で昇格できるからだ。しかし、float型とdecimal型を使う時はサフィックスの文字は必須の知識となる。サフィックス文字を付けないとdouble型になるが、この型からの暗黙の変換は存在しないからだ
- 16進数型、2進数型は存在しない。C#は内部で保存するときには常に2進数である。だから、0x10と16を区別する方法はない
- 16進数、2進数の値には区切りとして"_"が許される。だから、0xff_ffと0xffffは同じ値になる
参考リンク §
整数数値型 (C# リファレンス)
浮動小数点数値型 (C# リファレンス)
サンプルソース: numbers §
sub("123", 123);
sub("123f", 123f);
sub("123d", 123d);
sub("123m", 123m);
sub("123.0", 123.0);
sub("123u", 123u);
sub("123l", 123l); ;
sub("123ul", 123ul);
Console.WriteLine($"0x123: {0x123}");
Console.WriteLine($"0b1010: {0b1010}");
void sub(string name, object val )=>Console.WriteLine($"{name}: {val.GetType().FullName}");
実行結果 §
123: System.Int32
123f: System.Single
123d: System.Double
123m: System.Decimal
123.0: System.Double
123u: System.UInt32
123l: System.Int64
123ul: System.UInt64
0x123: 291
0b1010: 10
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
なぜfloat a = 0.1;はエラーになるのだろうか。正しい理由を選ぼう。
- 0.1は2進数では割り切れないから
- float型の変数を0.1というdouble型の数値で初期化しようとしたから。0.1fなら上手く行く
- 変数aを利用するコードを欠いているから
- floatは型名ではないから
- 0.1は整数ではないから
[[解答]]