[C#] C言語との違い (データ長変換)

C#のデータ型のvalueとreferenceの違いは、base classが System.Objectかそうでないかによる。System.Object系列はinheritanceによりすべてreferenceタイプになる。
コンパイラを使ったときに割とはまりがちなのがビット幅が狭くなる演算がエラーとなること。
何をしているかわかっている前提で何をしてもいい、ということはない。

int a = 16;
byte b = 0;
byte c = 8;
b = a;

エラー CS0266: 型 ‘int’ を ‘byte’ に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)
というエラーになる。
以下でも同じエラーが発生。

int a = 16;
byte b = 0;
byte c = 8;
b = (byte)a + c;

最後を以下のようにする。

b = (byte)(a + c);

byte間の演算をbyteに代入する場合にもエラーは発生する

int a = 16;
byte b = 0;
byte c = 8;
byte d = 0;
d = b + c;

これは代入文の右がデフォルトでintとして評価されているためで、byteへのキャストが必要になる。
C#の言語仕様では、+と~の演算を行うbit幅はint, uint, long, ulongの順に情報を失わない幅のものに決める。32bitでおさまならなければ64bitを使うようにコンパイラがコードを吐く。(C# 3.0 4.1.5 Integral types)。-の場合は int か long (必ず符号付き)の順に判断。
したがって、byte間演算ではintが採用されるので、結果もintになり、byteに代入するには明示的なcastが必要になる。

広告
%d人のブロガーが「いいね」をつけました。