• ベストアンサー

16進数のマスク処理

C#勉強中です。 以下のようなコードを書いてコンパイルをかけたところ、「型 'uint' を 'int' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) 」と出ました。この理由がわかりません。 0xFFFF00FFはなぜ符合なしとなってunsigned扱いになるのでしょうか。 [Code] int ret = 0; ret &= 0xFFFF00FF;

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

0xFFFF00FFは、10進数で4,294,902,015という大きな数値の16進数表現であり、 int型で表現できる-2,147,483,648 ~ 2,147,483,647の範囲外だからです。 uintの0xFFFF00FFと同じビットパターンが格納されるint型の値は -0x0000FF01(=-65281)ですが、数値ではなくビットパターンを表現したい のであれば、uint型を使用すべきです。 ちなみに、C#と異なりC言語は、このあたりの型のチェックが緩いため int ret = 0xFFFF00FF; でも int ret = 4294902015; エラーにならず retの中に0xFFFF00FFというビットパターンを代入できます。 これは一見便利そうですが、本来格納できない場所に平気で格納できる仕様 (上記の例で言うと符号ビットの部分を都合で勝手に使う仕様) は、メモリ破壊に繋がる諸刃の剣でもあります。 このため、最近の言語は安全性に配慮してメモリ破壊に繋がる仕様を 極力排除するのが主流です。

miniminic555
質問者

お礼

ご回答ありがとうございます。 intで表現できる範囲を超えている、というところに納得しました。 また、たしかに数値自体を使うのではなく、ビットパタンとして使うのであればuintであるべきですね。 解説ありがとうございました。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

>ご回答ありがとうございます。どうやらそのようですね。C#だとはねられるようです。 はねられるとかではなく 0x8000000~0xffffffff は、UInt32扱いになってるだけです。 理由は#2の方が書かれているようにInt32の範囲外だから。

miniminic555
質問者

お礼

コメントありがとうございます。 すみません、はねられるという表現は間違っていますね。ご指摘ありがとうございます。範囲外だから、というのが理由ですね。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

確認はしていませんがC#の仕様でそうなってるのでは?

miniminic555
質問者

お礼

ご回答ありがとうございます。どうやらそのようですね。C#だとはねられるようです。

関連するQ&A