我正在使用以下代码来签名扩展一个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程序员,所以在回答时请记住: - )
答案 0 :(得分:0)
C#中唯一的整数文字类型适用于int
,uint
,long
和ulong
(C# Language specification, version 5类型,第2.4.4.2节)。任何文字(例如0
)只会将其类型推断为其中一个(并且没有任何额外的指示,它是int
)。
那么,为什么:
short s = 0;
工作?这可能是由于隐式常量表达式转换(第6.1.9节):
类型
int
的常量表达式(第7.19节)可以转换为sbyte
,byte
,short
,{{ 1}},ushort
或uint
,前提是常量表达式的值在目标类型的范围内。
但是,我们在这里工作的并不是一个持续的表达。所以所有传统的C#打字规则都会发挥作用;在分析条件运算符时(第7.14节),类型为:
ulong
编译器(无法使用上述常量表达式规则)决定该表达式的类型为bool ? short : int;
,因为int
可能是隐含的转换为short
,但反之亦然。