8位和16位整数的算术运算

时间:2014-09-15 20:57:37

标签: c# int short

我明白为什么会产生编译时错误:

short x = 1;
short y = 2;
short z = x + y; // compile-time error

我已经掌握了为什么这样做没有任何问题:

short x = 1;
short y = 2;
x += y; // all right, because of c# specs section 7.17.2

但我不知道为什么这也有效:

short x = (short)1 + (short)2;

我希望得到与第一个示例中相同的编译时错误,但它运行成功...为什么?

3 个答案:

答案 0 :(得分:3)

由于您使用的是常量值,编译器可以检测到它是允许的,在编译时评估,并让它执行。生成的IL的计算结果与键入short x = 3;的结果相同。

请注意以下内容也有效(出于同样的原因):

const short x = 1;
const short y = 2;
short z = x + y; 

但这失败了:

const short x = 32000;
const short y = 32001;
short z = x + y;

请注意,这包含在C#语言规范,6.1.9隐式常量表达式转换中:

  • 如果constant-expression的值在目标类型的范围内,则int类型的常量表达式(第7.19节)可以转换为类型为sbyte,byte,short,ushort,uint或ulong。 / LI>

答案 1 :(得分:2)

您的上一个代码段只会编译为常量3。编译器不需要调用int中的任何运算符,它只是在编译时计算并存储该值。

short x = 3;

相同

这是生成的IL

IL_0001:  ldc.i4.3    //Load the constant 3 into evaluation stack
IL_0002:  stloc.0     // stores the value in stack to x

答案 2 :(得分:1)

  

我不知道为什么这也有效:

short x = (short)1 + (short)2;

编译器在编译时计算rhs表达式,并且可以证明结果在边界内。