当尝试`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的范围,因此没有任何从~0uint的隐含转换。 (当常量在int的有效值范围内时,只有从uint类型的常量到uint的隐式转换。)

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

uint mask = ~0U;

你可以投射,与unchecked结合:

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

......但那很难看。

另一答案

0被称为int,所以~0int。对于非负常量,有一个隐式转换,一切正常,但在这种情况下你想要:

uint mask = ~0U;

以上是关于当尝试`uint mask = ~0;`时,常量值'-1'不能转换为'uint'的主要内容,如果未能解决你的问题,请参考以下文章

作为常量的常用颜色值

第七章 常量和字段

在 SSE 中进行比较时的奇怪行为

具有 UINT32 值的 CListCtrl SetItemData

Go语言学习笔记3

从 Keil 中的 uint8_t 数组获取 uint16_t 值