在C#中进行按位运算时,为什么必须转0(零)?

时间:2014-04-14 09:17:29

标签: c# bitwise-operators

我正在使用以下代码来签名扩展一个12位值,我将其从1.5字节解压缩到16位:

word[0] |= ((word[0] & 0x800) != 0 ? (Int16)(-4096) : (Int16)0);

如果我没有将最后一个零转换为Int16,我会收到编译器的以下抱怨:

Warning 1   Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first
Error   2   Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)

这是为什么?我知道C#在执行按位操作时会将所有内容转换为int,但通常整数常量会自动赋予正确的类型。例如,如果我为浮点数指定零,我不必先将其转换为浮动浮点数。我是C程序员,所以在回答时请记住: - )

1 个答案:

答案 0 :(得分:0)

C#中唯一的整数文字类型适用于intuintlongulongC# Language specification, version 5类型,第2.4.4.2节)。任何文字(例如0)只会将其类型推断为其中一个(并且没有任何额外的指示,它是int)。

那么,为什么:

short s = 0;

工作?这可能是由于隐式常量表达式转换(第6.1.9节):

  

类型int常量表达式(第7.19节)可以转换为sbytebyteshort,{{ 1}},ushortuint,前提是常量表达式的值在目标类型的范围内。

但是,我们在这里工作的并不是一个持续的表达。所以所有传统的C#打字规则都会发挥作用;在分析条件运算符时(第7.14节),类型为:

ulong

编译器(无法使用上述常量表达式规则)决定该表达式的类型为bool ? short : int; ,因为int可能是隐含的转换为short,但反之亦然。