C#:将0xFFFFFFFF分配给int
我想使用十六进制数为int赋值:C#:将0xFFFFFFFF分配给int,c#,C#,我想使用十六进制数为int赋值: int i = 0xFFFFFFFF; // effectively, set i to -1 可以理解,编译器会抱怨。 问题,我如何使上述工作 这就是为什么我需要这个。 WritableBitmap类将像素数组公开为int[]。所以,如果我想将像素设置为蓝色,我会说:0xFF0000FF(ARGB)(-16776961) 另外,我很好奇是否有一个优雅的编译时解决方案 我知道有一个: int i = BitConverter.ToInt32(new byte[
int i = 0xFFFFFFFF; // effectively, set i to -1
可以理解,编译器会抱怨。
问题,我如何使上述工作
这就是为什么我需要这个。
WritableBitmap
类将像素数组公开为int[]。所以,如果我想将像素设置为蓝色,我会说:0xFF0000FF(ARGB)(-16776961)
另外,我很好奇是否有一个优雅的编译时解决方案
我知道有一个:
int i = BitConverter.ToInt32(new byte[] { 0xFF, 0x00, 0x00, 0xFF }, 0);
但它既不优雅,也不适合编译时使用。您只需要一个演员阵容:
给某人一条鱼,你喂他们一天教导他们注意编译器错误消息,他们不必在互联网上提出错误消息所回答的问题。
int i = 0xFFFFFFFF;
int i = unchecked((int)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 = 0xFFFFFFFF;
int i = unchecked((int)0xFFFFFFFF);
或
现在,没有错误
作为使用未检查语法的替代方法,如果您希望生活在危险之中,可以在编译器开关上指定/checked-
奖金问题:
首先是什么让文字成为一个uint
整型文字的类型不取决于它是十六进制还是十进制。而是:
- 如果十进制文字有
或U
后缀,则它是L
、uint
或long
,具体取决于您选择的后缀组合ulong
- 如果它没有后缀,那么我们取文本的值,看看它是否符合
、int
、uint
或long
的范围。该列表中首先匹配的是表达式的类型ulong
在这种情况下,十六进制文字的值不在
int
的范围内,但在uint
的范围内,因此它被视为uint
与可用的各种单字母数字后缀相比,未经检查的语法似乎有点“ish”(!)
所以我试着:
然后
因为湖里有更多的鱼
注意:它不是一个常量表达式,因此不能用于初始化枚举字段。作为旁注,如果您希望翻转所有位,最好、最简洁的方法是
int i=~0谢谢你的更正,利珀特先生。这个常量是一个无符号int,因为它不能表示为int。我的问题是如何使它工作,而不是“为什么它会断开”。我认为“可以理解,编译器抱怨”将表明我理解这个问题。原始错误不建议使用未检查的语法。我没有试着给它投上石膏,因为我知道那是行不通的。@user93422:如果你理解这个问题,你就不必问这个问题了。你问了这个问题,因此你不理解这个问题。@user93422:“我没有试着给它投石膏,因为我知道那不管用”——不试一下,你怎么知道?编译器明确地告诉您需要在那里进行强制转换,这是正确的。@Greg D--我来这里寻找完全相同的答案。我也理解这个问题,但作为一名C#程序员新手,我不知道“unchecked”语法。顺便说一句,我收到的错误消息是“常量值计算中溢出”,这对解决答案中所依赖的问题没有任何帮助。@EricLippert:您的评论“整型文字的类型不取决于它是十六进制还是十进制。”-是理解这种情况的最佳答案。通常人们比较文本(-1)的二进制表示和文本表示(4294967295)
static public class IntExtMethods
{
public static int ui(this uint a)
{
return unchecked((int)a);
}
}
int i = 0xFFFFFFFF.ui();