C#の低レイヤーのあれこれ

ビット演算(広義)

型や変数をまたぐビット演算をしたい。.NET Core 5.0.201 で実験してみた。

uint nA = 0;

sbyte byA = -1;

nA = (uint)byA;

Console.WriteLine(nA);


nA = (uint)(byte)byA;

Console.WriteLine(nA);


Console.WriteLine(unchecked((byte)-1)); // uncheckedをはずすとコンパイルエラー

(VSCodeから貼り付けると色がついてお得だね)

これの実行結果が以下。

4294967295
255
255

符号付きとそうでない型の変換はかなり非自明。
一方で符号の有無が一致している場合の変換はそのビットが意味する数値が一致する。(オーバーフローする場合を除く)
なのでsbyteをただのビット列として扱いたい、という場合は一旦byteに変換して符号を合わせつつ自明に8bitの範囲におさめてから操作するべきだ。

また型範囲の外の値を変換しようとした場合は範囲外切り捨てが行われる。
ただしリテラルについてはcheckedされるのか、コンパイルエラーが出る。unchecked式を書こう。
リテラルでなければオーバーフローは看過されるようだが、こういった状況が起こりうることを予想しているのであれば明示的に書くのもありかもしれない。

https://ufcpp.net/study/csharp/sp_checked.html