Color.FromArgb method принимает Int32
в качестве параметра. Значение Color.White равно #FFFFFFFF
как ARGB, которое равно 4.294.967.295
как десятичное (путь свыше int.MaxValue
). Что я здесь не понимаю? Как метод может принимать int
в качестве параметра, если допустимые значения ARGB превышают максимальное значение int
?Как может Color.FromArgb взять Int32 в качестве параметра?
ответ
Ваше замешательство заключается в вывеске. Хотя Int32.MaxValue равен 2,147,483,647, что подписано.
Если вы посмотрите на UInt32.MaxValue, то есть без знака, и, как вы можете видеть, максимальное значение составляет 4 294 967 295.
Вы видите, цифры с цифрами, в двоичном формате, используйте бит слева, чтобы определить, есть ли его положительное или отрицательное число. Неподписанные числа, в двоичном формате, не имеют бит-бит и используют этот последний бит, что существенно увеличивает емкость хранилища.
я думаю, одна из причин, что Color
класса использует Int32
вместо знака, потому что без знака ИНТА не являются CLS совместимыми, как указано в this SO Question
Был как раз на комментарий 'uint'. +1 – TyCobb
Байт-порядок 32-разрядного значения ARGB - AARRGGBB. Значимым байтом (MSB) , представленным AA, является значение альфа-компонента . Второй, третий и четвертый байты, представленные RR, GG и BB соответственно, являются цветовыми компонентами красного, зеленого и синего, соответственно.
http://msdn.microsoft.com/en-us/library/2zys7833(v=vs.110).aspx
Оказывается, что метод разбивает int32 в 32 бита и преобразует что AARRGGBB, который состоит из двух откусывание (1 байт) для каждого параметра А, R, G и B.
Это работает, потому что каждая цифра в FFFFFFFF в шестнадцатеричной форме преобразуется в один полубайт. Каждое пространство составляет 4 бита. Таким образом, это представление бит преобразуется непосредственно в 32 бита, который может быть представлен как один int32.
Чтобы дать только немного более подробно:
Максимальное значение пространства в шестнадцатеричной системе является F (или 15 в десятичной системе).
Максимальное значение из 4 битов (1 полубайт) является (8, 4, 2, 1), который также 15.
Так, FFFFFFFF = 1111 1111 1111 1111 1111 1111 1111 1111, который затем представлен в виде int32.
AS @icemanind указал, что первый бит зарезервирован для знака (+ или -) и, следовательно, ограничивает числовое значение int32 до 2,147,483,647.
Это не числовое значение, а значения бит, важные для этого метода.
Согласно странице MSDN для Color.FromArgb Method (Int32), вы не передадите значение int
для цвета. Например, чтобы получить красный цвет, вы бы назвали Color.FromArgb(0x78FF0000)
. Итак, для белого вам нужно просто позвонить Color.FromArgb(0xFFFFFFFF)
.
Color
состоит из четырех важных полей, A
(альфа), R
(красный), G
(зеленый) и B
(синий). Каждый из них - восемь бит. четыре восьмибитовых значения вписываются в int32. Хотя MSB может быть битом знака, это игнорируется.
0xFFFFFFFF
может быть отрицательным числом, если оно выражено как int
, но оно белого цвета.
Это не имеет значения.
#FFFFFFFF is 11111111111111111111111111111111 in binary.
В десятичной форме это 4.294.967.295 , если вы используете unsigned ints. Если вы используете подписанные ints, это интерпретируется как -1.
Но фактическое десятичное значение не имеет значения; имеет значение значение отдельных бит.
Подписанный int может хранить значения 4.294.967.295, только половина из них отрицательна. Биты такие же.
Это важно, если вы хотите, чтобы ваш код компилировался. –
К сожалению, так как Color.FromArgb принимает int
вместо uint
, вам нужно будет использовать ключевое слово unchecked для цветов, которые больше int.MaxValue.
var white = Color.FromArgb(unchecked((int)0xFFFFFFFF));
Нет, вы можете подавать это значение как int. Вы не можете кормить его как константу, хотя, поскольку компилятор перескакивает на это, но время выполнения в порядке с этим. Это работает: 'long l = 0xffffffff; Цвет c = Цвет.FromArgb ((int) l); 'this does not:' const long l = 0xffffffff; Цвет c = Цвет.FromArgb ((int) l); ' – TaW
Я предполагаю, что это сводится к тому, 'int' быть удобнее/чаще, чем' uint' и .NET в настоящее время просто на всех, здесь .. – TaW
Они просто необходимы 32 битов для кодирования четыре 8-битных значений. Какое имя у него было не так важно, если любой язык может его использовать. –