2014-09-11 3 views
4

Color.FromArgb method принимает Int32 в качестве параметра. Значение Color.White равно #FFFFFFFF как ARGB, которое равно 4.294.967.295 как десятичное (путь свыше int.MaxValue). Что я здесь не понимаю? Как метод может принимать int в качестве параметра, если допустимые значения ARGB превышают максимальное значение int?Как может Color.FromArgb взять Int32 в качестве параметра?

+0

Я предполагаю, что это сводится к тому, 'int' быть удобнее/чаще, чем' uint' и .NET в настоящее время просто на всех, здесь .. – TaW

+0

Они просто необходимы 32 битов для кодирования четыре 8-битных значений. Какое имя у него было не так важно, если любой язык может его использовать. –

ответ

3

Ваше замешательство заключается в вывеске. Хотя Int32.MaxValue равен 2,147,483,647, что подписано.

Если вы посмотрите на UInt32.MaxValue, то есть без знака, и, как вы можете видеть, максимальное значение составляет 4 294 967 295.

Вы видите, цифры с цифрами, в двоичном формате, используйте бит слева, чтобы определить, есть ли его положительное или отрицательное число. Неподписанные числа, в двоичном формате, не имеют бит-бит и используют этот последний бит, что существенно увеличивает емкость хранилища.

я думаю, одна из причин, что Color класса использует Int32 вместо знака, потому что без знака ИНТА не являются CLS совместимыми, как указано в this SO Question

+1

Был как раз на комментарий 'uint'. +1 – TyCobb

0

Байт-порядок 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.

Это не числовое значение, а значения бит, важные для этого метода.

-1

Согласно странице MSDN для Color.FromArgb Method (Int32), вы не передадите значение int для цвета. Например, чтобы получить красный цвет, вы бы назвали Color.FromArgb(0x78FF0000). Итак, для белого вам нужно просто позвонить Color.FromArgb(0xFFFFFFFF).

0

Color состоит из четырех важных полей, A (альфа), R (красный), G (зеленый) и B (синий). Каждый из них - восемь бит. четыре восьмибитовых значения вписываются в int32. Хотя MSB может быть битом знака, это игнорируется.

0xFFFFFFFF может быть отрицательным числом, если оно выражено как int, но оно белого цвета.

-1

Это не имеет значения.

#FFFFFFFF is 11111111111111111111111111111111 in binary.

В десятичной форме это 4.294.967.295 , если вы используете unsigned ints. Если вы используете подписанные ints, это интерпретируется как -1.

Но фактическое десятичное значение не имеет значения; имеет значение значение отдельных бит.

Подписанный int может хранить значения 4.294.967.295, только половина из них отрицательна. Биты такие же.

+1

Это важно, если вы хотите, чтобы ваш код компилировался. –

4

К сожалению, так как Color.FromArgb принимает int вместо uint, вам нужно будет использовать ключевое слово unchecked для цветов, которые больше int.MaxValue.

var white = Color.FromArgb(unchecked((int)0xFFFFFFFF)); 
+1

Нет, вы можете подавать это значение как int. Вы не можете кормить его как константу, хотя, поскольку компилятор перескакивает на это, но время выполнения в порядке с этим. Это работает: 'long l = 0xffffffff; Цвет c = Цвет.FromArgb ((int) l); 'this does not:' const long l = 0xffffffff; Цвет c = Цвет.FromArgb ((int) l); ' – TaW

 Смежные вопросы

  • Нет связанных вопросов^_^