C#:为int分配0xFFFFFFFF
我想使用hex数为int赋值:
int i = 0xFFFFFFFF; // effectively, set i to -1
可以理解,编译器抱怨。 问题,我如何进行上述工作?
这就是我需要这个的原因。 WritableBitmap
类将像素数组公开为int []。 所以,如果我想将像素设置为蓝色,我会说:0xFF0000FF(ARGB)( – 16776961)
另外,我很好奇是否有优雅的编译时解决方案。
我知道有一个:
int i = BitConverter.ToInt32(new byte[] { 0xFF, 0x00, 0x00, 0xFF }, 0);
但它既不优雅,也不编译时间。
你只需要一个未经检查的演员:
unchecked { int i = (int)0xFFFFFFFF; Console.WriteLine("here it is: {0}", i); }
给某人一条鱼,你喂他们一天。 教他们注意编译器错误消息,他们不必在互联网上提出错误消息回答的问题。
int i = 0xFFFFFFFF;
生产:
Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?)
注意错误消息并尝试添加强制转换 :
int i = (int)0xFFFFFFFF;
现在的错误是:
Constant value '4294967295' cannot be converted to a 'int' (use 'unchecked' syntax to override)
再次,请注意错误消息。 使用未经检查的语法。
int i = unchecked((int)0xFFFFFFFF);
要么
unchecked { int i = (int)0xFFFFFFFF; }
现在,没有错误。
作为使用未经检查的语法的替代方法,如果您希望危险地生活,可以指定/checked-
编译器开关。
奖金问题:
是什么让文字首先成为
uint
?
整数文字的类型不取决于它是hex还是十进制。 而是:
- 如果十进制文字具有
U
或L
后缀,那么它是uint
,long
或ulong
,具体取决于您选择的后缀组合。 - 如果它没有后缀,那么我们取字面值,看它是否适合
int
,uint
,long
或ulong
。 在该列表中首先匹配的是表达式的类型。
在这种情况下,hex literal的值超出int
的范围但在uint
的范围内,因此它被视为uint
。
与可用的各种单字母数字后缀相比,未经检查的语法似乎有点像’ish(!)。
所以我尝试了贝类 :
static public class IntExtMethods { public static int ui(this uint a) { return unchecked((int)a); } }
然后
int i = 0xFFFFFFFF.ui();
因为湖里有更多的鱼。
注意:它不是常量表达式,因此不能用于初始化枚举字段。