要演示的示例代码:
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
会导致编译错误,还有其他方法可以使其工作吗?
预先感谢
答案 0 :(得分:5)
0的类型为int
。 ~0
的类型仍然是int
,其常量值为-1。对于uint
来说,这超出了范围,因此从~0
到uint
没有任何隐式转换。 (当常量在int
的有效值范围内时,从类型uint
到uint
的隐式转换。)
最简单的解决方法是使用uint
类型的文字:
uint mask = ~0U;
您可以进行强制转换,并结合unchecked
:
uint mask = unchecked((uint)~0);
...但是那很丑。
答案 1 :(得分:2)
dput
被键入为0
,因此int
是~0
。对于非负常量,存在一个隐式强制转换,并且一切正常,但是在这种情况下,您需要:
int