【问题标题】:why & operator returns Int32 instead of bool?为什么 & 运算符返回 Int32 而不是 bool?
【发布时间】:2014-09-17 04:51:57
【问题描述】:
byte op1 = 20;
sbyte op2 = 30;
var result = op1 & op2;

我知道 & 运算符返回 bool,但我现在感到困惑。

为什么等于结果 20? 为什么结果是 Int32?

【问题讨论】:

  • & 运算符可以返回 boolintuint 等或指针。
  • @HenkHolterman:二进制 & 可以返回 5 种类型之一,但不能返回指针。看我的回答。
  • BurnOut 没有提到二进制文件。只是“& 运算符”

标签: c#


【解决方案1】:

我知道 & 运算符返回 bool

只有当操作数也是 bool 时才成立。 & 运算符是逻辑运算符还是按位运算符,具体取决于其操作数。来自documentation

二进制 & 运算符是为整数类型和 bool 预定义的。对于整数类型, & 计算其操作数的逻辑按位与。对于 bool 操作数, & 计算其操作数的逻辑与;也就是说,当且仅当它的两个操作数都为真时,结果才为真。

也许您在考虑&& 运算符,它是一个逻辑运算符(在任何预定义类型上),并且还执行短路。

至于为什么结果是int 而不是bytesbyteshortushort... C# 没有为小于 32 位的类型定义算术/位运算符。这在another Stack Overflow question 中进行了讨论,但并非特定于&

【讨论】:

  • 他们做出这样的区分似乎很奇怪;对于 bool 操作数,逻辑 AND 与按位 AND 不一样吗?
  • @Rawling:我尽量不认为bool 有一个特定的按位表示。想象一下,例如,如果您将true 视为“除 0 之外的任何值”......那么您可能有两个 true 值 1 和 2,它们的按位与值为 0(假),但是true 的逻辑与。
  • 嗯。我认为 C# 或 CLI 解决了 true & true == false 问题,方法是让 bool 总是在引擎盖下全为 1,但经过更多阅读 that's apparently not the case 和文档 确实 必须做出这种区分。
  • 这里是 link 关于位运算符
  • 不回答为什么结果是Int32 而不是某种byte 的问题。看我的回答。
【解决方案2】:

令我惊讶的是,其他较早的答案错过了这个问题的有趣部分,这让我为 C# 语言规范争吵。

是的,& 运算符是为许多不同的类型定义的。是的,如果两个参数都是bool,那么它会在评估其两个参数后执行逻辑与运算。也就是说,没有短路。效果是调用如下函数。

bool operator &(bool x, bool y);

但如果参数是整数,它会在评估两个参数后执行按位与运算并将它们转换为通用整数类型。效果是调用以下重载函数之一。

int operator &(int x, int y);
uint operator &(uint x, uint y);
long operator &(long x, long y);
ulong operator &(ulong x, ulong y);

请注意,这些函数没有shortbyte 版本,这就是Int32 中的结果。

我认为这是问题的真正答案。

【讨论】:

  • 这回答了Int32 vs Byte,但 OP 期待 Boolean
  • 我不同意,两者都很重要。我认为它回答了整个问题,而不仅仅是部分问题。我认为您可以将 OP 解读为“我明白为什么它可能是 bool 或 byte 但为什么是 Int32?”,但您必须问他。
【解决方案3】:

& 是按位运算符,如果两个位中的任何一个为 1,则返回 1,如果任何一个位为零,则返回 0。如果是整数或字节,就像您的问题一样,它会在两个操作数之间执行 AND 的按位运算,因此结果将是整数类型而不是布尔值。 尝试使用 &&,因为它是逻辑运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2011-02-09
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多