C#:将0xFFFFFFFF赋给int

THX*_*138 18 c#

我想使用十六进制数为int赋值:

int i = 0xFFFFFFFF; // effectively, set i to -1
Run Code Online (Sandbox Code Playgroud)

可以理解,编译器抱怨.问题,我如何进行上述工作?

这就是我需要这个的原因. WritableBitmapclass将像素数组公开为int [].所以,如果我想将像素设置为蓝色,我会说:0xFF0000FF(ARGB)( - 16776961)

如果有一个优雅的编译时解决方案,我很好奇.

我知道有一个:

int i = BitConverter.ToInt32(new byte[] { 0xFF, 0x00, 0x00, 0xFF }, 0);
Run Code Online (Sandbox Code Playgroud)

但它既不优雅,也不编译时间.

Eri*_*ert 88

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

int i = 0xFFFFFFFF; 
Run Code Online (Sandbox Code Playgroud)

生产:

Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists 
(are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

注意错误消息并尝试添加强制转换:

int i = (int)0xFFFFFFFF; 
Run Code Online (Sandbox Code Playgroud)

现在的错误是:

Constant value '4294967295' cannot be converted to a 'int' 
(use 'unchecked' syntax to override)
Run Code Online (Sandbox Code Playgroud)

再次,请注意错误消息.使用未经检查的语法.

int i = unchecked((int)0xFFFFFFFF); 
Run Code Online (Sandbox Code Playgroud)

要么

unchecked
{
    int i = (int)0xFFFFFFFF; 
}
Run Code Online (Sandbox Code Playgroud)

现在,没有错误.

作为使用未经检查的语法的替代方法,您可以/checked-在编译器开关上指定,如果您希望危险地生活.

奖金问题:

什么使文字成为uint首位?

整数文字的类型不取决于它是十六进制还是十进制.而是:

  • 如果十进制文字具有U或L后缀,那么它是uint,long或者ulong,取决于您选择的后缀的组合.
  • 如果它没有后缀那么我们就字面的价值,看它是否适合的范围内int,uint,long或ulong.在该列表中首先匹配的是表达式的类型.

在这种情况下,十六进制文字的值超出范围int但在范围内uint,因此将其视为a uint.

  • +1非常简洁(和教育)答案.非常好.:) (11认同)
  • @ user93422:如果你理解了这个问题,你就不必提出这个问题了.你问了这个问题,所以你不明白这个问题. (7认同)
  • @Greg D - 我来到这里寻找完全相同的答案.我也理解了这个问题,但是没有意识到"未经检查"的语法是新手C#程序员.顺便说一下,我得到的错误信息是"常数值计算溢出",它没有提供任何帮助来解决答案中所依赖的问题. (4认同)

Pau*_*ter 14

你只需要一个未经检查的演员:

unchecked
{
    int i =  (int)0xFFFFFFFF;

    Console.WriteLine("here it is: {0}", i);
}
Run Code Online (Sandbox Code Playgroud)

  • 作为旁注,如果你想要翻转所有位,最好的,最简洁的方法是`int i = ~0;` (2认同)