当尝试`uint mask =〜0;`时,常量值'-1'不能转换为'uint'。

时间:2019-04-03 10:45:40

标签: c#

要演示的示例代码:

public int FindComplement(int num) {
    //uint mask = ~0;       //<-- error CS0031
    //uint mask = (uint)~0; //<-- error

    uint i = 0; 
    uint mask = ~i; //<-- it works

    while((mask&num) != 0) mask <<= 1;

    return (int)~mask^num;
}

当我尝试uint mask = ~0时,会导致如下错误

  

错误CS0031:常量值“ -1”不能转换为“ uint”

然后我使用类似uint i = 0; uint mask = ~i的代码尝试了它,

我的问题是为什么uint mask = ~0会导致编译错误,还有其他方法可以使其工作吗?

预先感谢

2 个答案:

答案 0 :(得分:5)

0的类型为int~0的类型仍然是int,其常量值为-1。对于uint来说,这超出了范围,因此从~0uint没有任何隐式转换。 (当常量在int的有效值范围内时,从类型uintuint的隐式转换。)

最简单的解决方法是使用uint类型的文字:

uint mask = ~0U;

可以进行强制转换,并结合unchecked

uint mask = unchecked((uint)~0);

...但是那很丑。

答案 1 :(得分:2)

dput被键入为0,因此int~0。对于非负常量,存在一个隐式强制转换,并且一切正常,但是在这种情况下,您需要:

int