繁体   English   中英

Color.FromArgb如何将Int32作为参数?

[英]How can Color.FromArgb take Int32 as parameter?

Color.FromArgb方法Int32作为参数。 Color.White的值为ARFF#FFFFFFFF ,其为十进制的4.294.967.295 (超过int.MaxValue )。 我在这里不理解什么? 如果有效ARGB值高于int的最大值,该方法如何将int作为参数?

不幸的是,由于Color.FromArgb采用int而不是uint ,因此需要对大于int.MaxValue的颜色使用unchecked关键字。

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

你的困惑在于标牌。 虽然Int32.MaxValue等于2,147,483,647,但它已签名。

如果你看一下UInt32.MaxValue ,那是无符号的,正如你所看到的,最大值是4,294,967,295。

你看,有符号数字,二进制,使用最左边的位来确定它是正数还是负数。 二进制的无符号数字没有有符号位并使用最后一位,使您的存储容量基本上翻倍。

我认为Color类使用Int32而不是unsigned的部分原因是因为unsigned int不符合CLS,如本SO问题所述

实际问题是您要输入一个八位十六进制数字,但由于单参数版本使用的是int而不是uint ,因此很难用Alpha值高于&7F来表示颜色。 这是因为int使用一位来表示符号。

最简单的解决方案是使用四参数版本:

var whiteColor = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);

32位ARGB值的字节顺序是AARRGGBB。 由AA表示的最高有效字节(MSB)是alpha分量值。 分别由RR,GG和BB表示的第二,第三和第四字节分别是红色,绿色和蓝色。

http://msdn.microsoft.com/en-us/library/2zys7833(v=vs.110).aspx

看起来该方法将int32分成32位并将其转换为AARRGGBB,对于每个参数A,R,G和B,它是两个半字节(1个字节)。

这是有效的,因为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。

它不是数值,而是对此方法很重要的位值。

根据Color.FromArgb方法(Int32)的MSDN页面,您不传递颜色的实际int值。 例如,要获得红色,您将调用Color.FromArgb(0x78FF0000) 所以,对于白色,你应该只需要调用Color.FromArgb(0xFFFFFFFF)

Color由四个重要字段组成, A (alpha), R (红色), G (绿色)和B (蓝色)。 每个都是8位。 四个八位值适合int32。 虽然MSB可能是符号位,但是会被忽略。

当表示为int0xFFFFFFFF可以是负数,但是它是白色的颜色。

没关系。

#FFFFFFFF是二进制的11111111111111111111111111111111。

如果你使用无符号整数 ,则在十进制中它是4.294.967.295。 如果您使用的是有符号整数,则将其解释为-1。

但实际的十进制值无关紧要; 重要的是各个位的价值。

signed int仍然可以存储4.294.967.295值,其中只有一半是负数。 这些位是相同的。

您可以怀疑0x00FFFFFF-0x01000000编译器将正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM