这会导致溢出吗?如果不是,为什么不呢?因为'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
答案 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);
此代码将分别输出100
和44
。当这个代码执行时实际发生的是添加操作导致大于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
进行显式数字转换,默认情况下在未经检查的上下文中运行,因此会截断结果。