10

Color.FromArgbメソッドInt32パラメーターとして受け取ります。Color.Whiteの値はARGB#FFFFFFFFであり、これは4.294.967.29510 進数です (はるかに上int.MaxValue)。ここで何が理解できませんか?int有効な ARGB 値が の最大値を超えている場合、メソッドはどのようにパラメーターとして受け取ることができますintか?

4

8 に答える 8

17

残念ながら、Color.FromArgbは のint代わりに を受け取るため、int.MaxValue より大きい色には unchecked キーワードuint使用する必要があります。

var white = Color.FromArgb(unchecked((int)0xFFFFFFFF));
于 2014-09-11T15:50:07.257 に答える
4

あなたの混乱は看板にあります。Int32.MaxValueは 2,147,483,647 ですが、これは符号付きです

UInt32.MaxValueを見ると、これは符号なしであり、ご覧のとおり、最大値は 4,294,967,295 です。

ご覧のとおり、バイナリの符号付き数値は、左端のビットを使用して、正数か負数かを判断します。バイナリの符号なし数値には符号付きビットがなく、その最後のビットを利用するため、実質的に 2 倍のストレージ容量が得られます。

Colorクラスが unsigned の代わりに使用する理由の一部は、この SO QuestionInt32に記載されているように、unsigned int が CLS に準拠していないためだと思います。

于 2014-09-11T15:43:55.497 に答える
2

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 に制限されます。

数値ではなく、このメソッドで重要なのはビット値です。

于 2014-09-11T15:40:10.803 に答える
-1

それは問題ではありません。

#FFFFFFFF は、バイナリで 111111111111111111111111111111 です。

unsigned ints を使用している場合、 10 進数では 4.294.967.295です。signed int を使用している場合は、-1 として解釈されます。

しかし、実際の 10 進数値は重要ではありません。重要なのは、個々のビットの値です。

signed int は引き続き 4.294.967.295 の値を格納できますが、その半分だけが負の値です。ビットは同じです。

于 2014-09-11T15:45:37.333 に答える