代码之家  ›  专栏  ›  技术社区  ›  ChaseMedallion

当或ing两个ulong时,用于符号扩展操作数的按位或运算符

c#
  •  0
  • ChaseMedallion  · 技术社区  · 6 年前

    var a = (ulong)5;
    var b = a | (ulong)new int[10].Length;
    

    符号扩展操作数上使用的按位或运算符;请考虑强制转换 先使用较小的无符号类型

    这个警告的理由是什么?在我看来,或的两边都应该有静态类型 ulong

    1 回复  |  直到 6 年前
        1
  •  4
  •   Damien_The_Unbeliever    6 年前

    关键是 Length 返回一个 int * ulong 这导致了符号扩展(因为,实际上,它首先通过 long ).

    如果你愿意 uint 铸造前 无符号长整型 ,警告将消失 1个

    var a = (ulong)5;
    var b = a | (ulong)(uint)new int[10].Length;
    

    从许多方面来说,这可以归结为一个事实,即C#cast可以做不同的事情。有些根本不改变数据,只是编译器如何对其进行操作,有些则需要实际的转换。我 有时 对现代C++的向往 reinterpret_cast


    * 是的,我们都知道 无论如何都不会返回负数,因此这里的符号扩展不存在问题。但是,无符号类型的原因有很多, 一般来说

    例如,如果你在进行位操作,你通常会关心 而不是如何解释为一个数字。 无符号长整型 长的 通常在这里没有意义,因为 一个数字,它是一个位字段。

    1个