我使用以下代码来签名扩展从1.5字节到16位的12位值:
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程序员,所以在回答时请记住这一点:-)
发布于 2014-04-14 09:30:47
C#中唯一的整数类型是int、uint、long和ulong (C#语言规范,第5版,第2.4.4.2节)。任何文字(如0)都只能将其类型推断为这4种文字中的一种(而且没有任何额外的指示,它是int)。
那么,为什么:
short s = 0;工作?这是由于隐含的常量表达式转换(第6.1.9节):
int类型的常量表达式(§7.19)可以转换为sbyte、byte、short、ushort、uint或ulong类型,条件是常量表达式的值在目标类型的范围内。
但是,我们在这里所做的并不是一个固定的表达。因此,所有传统的C#类型规则都起作用;在分析条件运算符(第7.14节)时,类型如下:
bool ? short : int;编译器(不能使用上述常量表达式规则)决定该表达式的类型是int,因为short可以隐式转换为int,反之亦然。
https://stackoverflow.com/questions/23056327
复制相似问题