繁体   English   中英

按位运算,ulong和int

[英]Bitwise operations, ulong and int

我刚刚发现C#不允许你对ulongint执行按位操作。 intuintlongulong每个其他组合都可以工作,但是一个配对没有。

但是 ,如果不是int ,我有一个const int ,一切都很好。

这里发生了什么? 为什么int & ulong无效,但const int & ulong有效吗?


破碎:

int mask = 0x1110;
ulong value = 0x1010;

var result = mask & value; // Compilation error: "Operator '&' cannot be applied to operands of type 'int' and 'ulong'"

工作:

const int mask = 0x1110;
ulong value = 0x1010;

var result = mask & value; // Works just fine.

此行为不是特定于按位操作。 根据C#语言规范 ,它适用于所有需要数字促销的二进制操作。

第7.6.3.2节描述了二进制数字促销。 我强调了指明您看到的行为的部分:

二进制数字促销包括按照它们在此处显示的顺序应用以下规则:

  • 如果任一操作数的类型为decimal ,则另一个操作数将转换为decimal类型,或者如果另一个操作数的类型为floatdouble则会发生绑定时错误。
  • 否则,如果任一操作数的类型为double ,则另一个操作数将转换为double类型。
  • 否则,如果任一操作数的类型为float ,则另一个操作数将转换为float类型。
  • 否则,如果一个操作数的类型是ulong ,则另一个操作数转换为类型ulong ,或者如果其他操作数的类型的发生结合时错误sbyteshortint ,或long
  • 否则,如果任一操作数的类型为long ,则另一个操作数将转换为long类型。
  • 否则,如果任一操作数的类型为uint而另一个操作数的类型为sbyteshort或int,则两个操作数都将转换为long类型。
  • 否则,如果任一操作数的类型为uint ,则另一个操作数将转换为类型uint
  • 否则,两个操作数都将转换为int类型。

使用const时不会发生问题的原因是允许编译器将const int表达式转换为其他类型,如7.19节所述:

隐式常量表达式转换(第6.1.9节)允许将int类型的常量表达式转换为sbytebyteshortushortuintulong ,前提是常量表达式的值在目标类型的范围内。

由于mask的值(即0x1110 )适合ulong ,编译器会执行提升而不是触发错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM