.NET中颜色转数值机制及Color.Red与0xFFFF0000不等的疑问
问题解析:Color.Red.ToArgb()与0xFFFF0000的比较差异
核心原因:带符号/无符号整数的类型区别
Color.Red.ToArgb()返回的是32位带符号整数(int),而你定义的sigma = 0xFFFF0000默认是32位无符号整数(uint)。两者的二进制完全一致(都是11111111 11111111 00000000 00000000),但数值解析规则不同:
- 作为int时,最高位是符号位,这个二进制被解读为补码,结果是
-65536 - 作为uint时,最高位是普通数据位,结果是十进制的
4294901760
分量比较为true的原因
你用位掩码提取颜色分量时,不管是int还是uint,提取出的0-255范围内的分量值在两种类型中是等价的:
- 位掩码
0x00FF0000等属于int类型(数值在int范围内) - 运算时int会被转换为uint,但最终提取出的Red/Green/Blue分量都是255/0/0,所以比较结果为true。
整体比较为false的特殊情况
按C#的类型转换规则,int和uint比较时会把int转成uint,-65536转成uint就是4294901760,理论上delta == sigma应该输出true。如果你的代码输出false,大概率是以下情况:
- 代码书写错误:比如
sigma写错成0xFF0000(少了两位FF,对应Alpha分量缺失) - 使用了非标准的Color.Red:比如自定义了Alpha分量不为255的Red颜色
如果要让两者比较为true,需要强制统一类型:
// 强制将sigma转为带符号int(需要unchecked避免溢出报错) int sigma = unchecked((int)0xFFFF0000); // 此时delta == sigma会输出true
内容的提问来源于stack exchange,提问作者luvairo
相关产品推荐
相关产品推荐

