Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否可以'conv.ovf.u8.un'throw'OverflowException`?_.net_Cil - Fatal编程技术网

.net 是否可以'conv.ovf.u8.un'throw'OverflowException`?

.net 是否可以'conv.ovf.u8.un'throw'OverflowException`?,.net,cil,.net,Cil,我正在做CIL的解释器,遇到了conv.ovf.u8.un 通过测试,我意识到即使0xffffffffffffffff在堆栈上,conv.ovf.u8.un仍然不会抛出OverflowException 以下代码: ldc.i8 0xffffffffffffffff conv.ovf.u8.un box [mscorlib]System.UIntPtr callvirt instance string [mscorlib]System.Object::ToString() call void [

我正在做CIL的解释器,遇到了
conv.ovf.u8.un

通过测试,我意识到即使
0xffffffffffffffff
在堆栈上,
conv.ovf.u8.un
仍然不会抛出
OverflowException

以下代码:

ldc.i8 0xffffffffffffffff
conv.ovf.u8.un
box [mscorlib]System.UIntPtr
callvirt instance string [mscorlib]System.Object::ToString()
call void [mscorlib]System.Console::WriteLine(string)
工作正常,无一例外

总的来说,这似乎是意料之中的。但是ECMA-335说:

将unsigned转换为unsigned int64(在堆栈上作为int64) 并在溢出时抛出异常


这就是为什么我决定询问社区,当
conv.ovf.u8.un
抛出
OverflowException

@HansPassant时,操作码是否在转换i8的特定情况下永远不会产生溢出,因为该值被假定为无符号且始终适合。不过,您可以通过在堆栈上放置负数或太大的浮点值之类的内容使其溢出。C#编译器不会为这种直接转换生成操作码,因为它永远不会假定浮点值是无符号的,并首先注入
conv.ovf.u8
转换(这将是抛出的转换),但在IL级别上是允许的。