i_amaiの雑記

お金稼ぎが目的のブログです

チルダ記号でビット反転するとintでキャストされる

どうも、こんにちは。

C#を勉強中なのですが、Convert.ToString()の挙動についてちょっとハマりました。

問題

using System;

class Sample
{
  static void Main()
  {
    byte a = 2;
    Console.WriteLine(Convert.ToString(~a, 2));
  }
}

この時、aはbyte型(8ビット)なので、Convert.ToString(~a, 2)の結果も当然8ビットで出力されると思っていたのですが、なぜか32ビットで出力されちゃいます。

f:id:i_amai:20190102234210p:plain
ConvertToString

なんでや。

~(チルダ)とaの間に(byte)と明示的にキャストすることで正しい値を表示させることはできるのですが、なんかモヤっとする…

解決法(?)

~(チルダ)が悪さをしているようです。

~(チルダ)は元の値がbyteだろうが何だろうが自動でint型以上のビットでキャストしてしまうので、それを防ぐにはやっぱり明示的にキャストするしかないみたい。

この仕様は公式には言及されてなくて(あろうことか「All integer types support the ~ operator.」と書いてある!)、ちょっと調べた感じでは古い記事になるものの、下記くらいしか見つかりませんでした。

参考サイト

~ the result of the NOT operation has been cast to a byte . This is because the operator returns an integer value, which cannot be assigned directly into a byte.

今見返したら持っている入門書にもそれっぽいこと書いてあったので、もしかしたら周知の事実かもしれませんが。

というわけで、この辺で。