C#:将0xFFFFFFFF赋给int

时间:2011-07-23 00:22:25

标签: c#

我想使用十六进制数为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);

但它既不优雅,也不编译。

3 个答案:

答案 0 :(得分:87)

给某人一条鱼,你喂他们一天。 教他们注意编译器错误消息,他们不必在互联网上提出错误消息回答的问题。

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的原因是什么?

整数文字的类型取决于它是十六进制还是十进制。更确切地说:

  • 如果十进制文字具有UL后缀,那么它是uintlongulong,具体取决于您选择的后缀组合
  • 如果它没有后缀,那么我们取文字的值,看看它是否适合intuintlong或{{1}的范围}。在该列表中首先匹配的是表达式的类型。

在这种情况下,十六进制文字的值不在ulong的范围内,但在int的范围内,因此它被视为uint

答案 1 :(得分:13)

您只需要unchecked演员:

unchecked
{
    int i =  (int)0xFFFFFFFF;

    Console.WriteLine("here it is: {0}", i);
}

答案 2 :(得分:3)

与可用的各种单字母数字后缀相比,未经检查的语法似乎有点gar'ish(!)。

所以我尝试了shellfish

static public class IntExtMethods
{
    public static int ui(this uint a)
    {
        return unchecked((int)a);
    }
}

然后

int i = 0xFFFFFFFF.ui();

因为湖里有更多的鱼。

注意:它不是常量表达式,因此不能用于初始化枚举字段。