首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按位操作、ulong和int

按位操作、ulong和int
EN

Stack Overflow用户
提问于 2016-12-14 15:22:15
回答 1查看 3.3K关注 0票数 7

我刚刚发现,C#不允许您对ulongint执行按位操作。intuintlongulong的每一种组合都能工作,但这一组合却行不通。

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

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

破碎:

代码语言:javascript
复制
int mask = 0x1110;
ulong value = 0x1010;

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

工作:

代码语言:javascript
复制
const int mask = 0x1110;
ulong value = 0x1010;

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-14 15:41:54

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

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

二进制数字提升包括应用以下规则,按照它们在这里出现的顺序:

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

使用const时没有出现问题的原因是编译器可以将const int表达式转换为其他类型,如第7.19节所述:

隐式常量表达式转换(§6.1.9)允许将int类型的常量表达式转换为sbytebyteshortushortuintulong,只要常量表达式的值在目标类型的范围内。

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41146148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档