这会导致溢出吗?为什么不呢?

时间:2013-07-28 19:42:30

标签: c# types casting

这会导致溢出吗?如果不是,为什么不呢?因为'byte'类型仍然保持8位大小,如果它不会导致溢出,那么这意味着'cast'会将'byte'类型在内存中的分配从8位增加到32位吗?类型转换[隐含]实际上是如何工作的?

//a part of c# program

byte b = 100;
b = (Byte)(b + 200);
Console.WriteLine("VALUE OF BYTE TYPE'S OBJECT {0}",b);

//end 

5 个答案:

答案 0 :(得分:3)

如果表达式产生的值超出目标类型的范围,则结果将被截断。

如果您想知道代码是否产生溢出,您应该使用checked语句(msdn):

checked
{
    byte b = 100;
    b = (Byte)(b + 200);
    Debug.WriteLine("VALUE OF BYTE TYPE'S OBJECT {0}", b); 
}

答案 1 :(得分:2)

隐式转换是b+200。那个隐式变成一个int,等于300,就像MSDN doc说的那样。然后你显式强制转换为byte,将其截断为8位。正如kmatyaszek建议的那样,您可以在checked块中的运行时启用溢出检查。

答案 2 :(得分:1)

考虑您的代码段如下:

byte b = 100;
Console.WriteLine(b);

b = (Byte)(b + 200);

Console.WriteLine(b);

此代码将分别输出10044。当这个代码执行时实际发生的是添加操作导致大于8位的值,但是程序并不关心并只取最后1个字节(例如32位值中的最后8位)

编辑:忘记提及执行该操作时不会导致溢出错误/异常。考虑一下代码:

b = Byte.MaxValue;
Console.WriteLine(b);
b++;
Console.WriteLine(b);

哪个输出255& 0

但是这段代码会:

b = Byte.MaxValue;
Console.WriteLine(b);
b = checked((byte)(b + 1));
Console.WriteLine(b);

请参阅:

答案 3 :(得分:1)

不,因为当你执行一个显式的强制转换(并且你必须因为它明确地变成int)时,它就像你对编译器说的那样“是的我知道我在做什么,无论如何都要这样做”,所以结果将是( 300 - 256 = 44),因此要导致溢出异常,您需要在正确的try / catch块中添加如下所示的已检查关键字:

try
{
   byte b = 100;
   b = checked((byte)(b + 200));
   Console.WriteLine("VALUE OF BYTE TYPE'S OBJECT {0}", b);
}
catch(OverFlowException e)
{
   Console.WriteLine(e.Message);
}

答案 4 :(得分:1)

参见C#语言规范:

  

7.6.12已选中和未选中的运算符

     

以下操作受溢出检查上下文的影响   由经过检查和未经检查的运营商和声明建立:
  ...
  •显式数字转换(第6.2.1节)从一个整数类型到   另一种整数类型,或从浮点数或双精度到整数类型。

     

当上述操作之一产生的结果太大时,   表示在目标类型中的操作的上下文   执行控制结果行为:
  ...
  •未经检查   上下文,通过丢弃任何高位来截断结果   * 不适合目的地类型 *。

     

对于非常量表达式(在   任何已检查或未检查的运算符未包含的运行时)   或语句,未选中默认溢出检查上下文   除非外部因素(如编译器切换和执行   环境配置)要求检查评估。

这个 - (byte)int进行显式数字转换,默认情况下在未经检查的上下文中运行,因此会截断结果。