对两个ulong进行“或”运算时,“在符号扩展的操作数上使用按位或运算符”

时间:2018-08-15 16:55:10

标签: c#

以下C#代码生成警告:

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

在符号扩展的操作数上使用按位或运算符;考虑铸造   改成较小的无符号类型

此警告的原因是什么?在我看来,OR的两端都应具有静态类型ulong,因此不应发生符号扩展。

1 个答案:

答案 0 :(得分:4)

重点是Length返回了int * 。然后,您强制转换为ulong,这导致了符号扩展(因为实际上,它首先通过了long)。

如果在投射到uint之前已经投射到ulong,警告将消失 1

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

在很多方面,这可以归结为C#强制转换可以做不同的事情。有些根本不更改数据,而只是更改编译器的作用,而其他一些则需要实际转换。我有时会渴望现代C ++的reinterpret_cast等。


* 是的,我们都知道Length绝不会返回负数,因此此处的符号扩展名不是问题。但是,将无符号类型(通常为 )应委托给垃圾箱有多种原因。

例如,如果您要进行位操作,则通常会关心,而不是如何将它们解释为数字。 ulonglong在这里通常没有意义,因为它不是数字,而是位字段。

1 即警告已经告诉您要做什么。首先转换为较小的无符号类型。