Color.FromArgbメソッドはInt32
パラメーターとして受け取ります。Color.Whiteの値はARGB#FFFFFFFF
であり、これは4.294.967.295
10 進数です (はるかに上int.MaxValue
)。ここで何が理解できませんか?int
有効な ARGB 値が の最大値を超えている場合、メソッドはどのようにパラメーターとして受け取ることができますint
か?
8 に答える
残念ながら、Color.FromArgbは のint
代わりに を受け取るため、int.MaxValue より大きい色には unchecked キーワードをuint
使用する必要があります。
var white = Color.FromArgb(unchecked((int)0xFFFFFFFF));
あなたの混乱は看板にあります。Int32.MaxValueは 2,147,483,647 ですが、これは符号付きです。
UInt32.MaxValueを見ると、これは符号なしであり、ご覧のとおり、最大値は 4,294,967,295 です。
ご覧のとおり、バイナリの符号付き数値は、左端のビットを使用して、正数か負数かを判断します。バイナリの符号なし数値には符号付きビットがなく、その最後のビットを利用するため、実質的に 2 倍のストレージ容量が得られます。
Color
クラスが unsigned の代わりに使用する理由の一部は、この SO QuestionInt32
に記載されているように、unsigned int が CLS に準拠していないためだと思います。
32 ビット ARGB 値のバイト順は AARRGGBB です。AA で表される最上位バイト (MSB) は、アルファ コンポーネント値です。それぞれ RR、GG、BB で表される 2 番目、3 番目、4 番目のバイトは、それぞれ赤、緑、青の色成分です。
http://msdn.microsoft.com/en-us/library/2zys7833(v=vs.110).aspx
このメソッドは int32 を 32 ビットに分割し、それを各パラメータ A、R、G、および B の 2 つのニブル (1 バイト) である AARRGGBB に変換するようです。
これが機能するのは、16 進数の FFFFFFFF の各桁が 1 つのニブルに変換されるためです。具体的には、各スペースは 4 ビットに相当します。したがって、このビット表現は 32 ビットに直接変換され、単一の int32 として表現できます。
もう少し詳しく説明すると、次のようになります。
スペースの最大値は 16 進数で F (または 10 進数で 15) です。
4 ビット (1 ニブル) の最大値は (8, 4, 2, 1) で、これも 15 です。
したがって、FFFFFFFF = 1111 1111 1111 1111 1111 1111 1111 1111 となり、 int32 として表されます。
@icemanind が指摘したように、最初のビットは符号 (+ または -) 用に予約されているため、int32 の数値は 2,147,483,647 に制限されます。
数値ではなく、このメソッドで重要なのはビット値です。
それは問題ではありません。
#FFFFFFFF は、バイナリで 111111111111111111111111111111 です。
unsigned ints を使用している場合、 10 進数では 4.294.967.295です。signed int を使用している場合は、-1 として解釈されます。
しかし、実際の 10 進数値は重要ではありません。重要なのは、個々のビットの値です。
signed int は引き続き 4.294.967.295 の値を格納できますが、その半分だけが負の値です。ビットは同じです。