当尝试`uint mask = ~0;`时,常量值'-1'不能转换为'uint'
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当尝试`uint mask = ~0;`时,常量值'-1'不能转换为'uint'相关的知识,希望对你有一定的参考价值。
演示的示例代码:
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的类型是int
。 ~0
的类型仍然是int
,常数值为-1。这超出了uint
的范围,因此没有任何从~0
到uint
的隐含转换。 (当常量在int
的有效值范围内时,只有从uint
类型的常量到uint
的隐式转换。)
最简单的解决方法是使用uint
类型的文字:
uint mask = ~0U;
你可以投射,与unchecked
结合:
uint mask = unchecked((uint)~0);
......但那很难看。
另一答案
0
被称为int
,所以~0
是int
。对于非负常量,有一个隐式转换,一切正常,但在这种情况下你想要:
uint mask = ~0U;
以上是关于当尝试`uint mask = ~0;`时,常量值'-1'不能转换为'uint'的主要内容,如果未能解决你的问题,请参考以下文章