C# -1*int.MinValue给出一个错误
当我写这段代码时C# -1*int.MinValue给出一个错误,c#,.net,int,C#,.net,Int,当我写这段代码时 Console.WriteLine(-1 * int.MinValue); 或 我犯了一个错误 在检查模式下,操作在编译时溢出 是否有专门针对该值的编译时检查? 或者它是实时计算所有编写的表达式吗?编译器能够在编译时而不是在运行时执行(乘法)计算,所以它是这样做的 由于-1*int.MinValue(-1*-2147483648,因此2147483648)大于int.MaxValue(2147483647),因此会出现编译错误 要证明这不是你的确切陈述,请尝试: Consol
Console.WriteLine(-1 * int.MinValue);
或
我犯了一个错误
在检查模式下,操作在编译时溢出
是否有专门针对该值的编译时检查?
或者它是实时计算所有编写的表达式吗?编译器能够在编译时而不是在运行时执行(乘法)计算,所以它是这样做的 由于
-1*int.MinValue
(-1*-2147483648,因此2147483648)大于int.MaxValue
(2147483647),因此会出现编译错误
要证明这不是你的确切陈述,请尝试:
Console.WriteLine(-2 * 1073741826);
您将获得相同的行为。编译器能够在编译时而不是在运行时执行(乘法)计算,因此它可以 由于
-1*int.MinValue
(-1*-2147483648,因此2147483648)大于int.MaxValue
(2147483647),因此会出现编译错误
要证明这不是你的确切陈述,请尝试:
Console.WriteLine(-2 * 1073741826);
您将得到相同的行为。Int(或者更确切地说是Int32)可以保存任何32位整数值。范围从-2147483648到2147483647
-1*-2147483648=2147483648。这大于最大Int32值。这就是你得到溢出的原因
如果要进行计算,可以将其中一个值强制转换为Int64。因此,这应该是可行的:
(Int64)(-1)*int.MinValue;
Int(或者更确切地说是Int32)可以保存任何32位整数值。范围从-2147483648到2147483647
-1*-2147483648=2147483648。这大于最大Int32值。这就是你得到溢出的原因
如果要进行计算,可以将其中一个值强制转换为Int64。因此,这应该是可行的:
(Int64)(-1)*int.MinValue;
无需进行特殊检查-值自然溢出。就像:
Console.WriteLine(int.MaxValue + 1);
这显然溢出了int
——它的值与int.MinValue*-1
的值相同
根据C#4规范第7.19节:
除非常量表达式显式放置在未检查的上下文中,否则在表达式的编译时计算期间,整数类型算术运算和转换中发生的溢出总是会导致编译时错误
无需进行特殊检查-值自然溢出。就像:
Console.WriteLine(int.MaxValue + 1);
这显然溢出了int
——它的值与int.MinValue*-1
的值相同
根据C#4规范第7.19节:
除非常量表达式显式放置在未检查的上下文中,否则在表达式的编译时计算期间,整数类型算术运算和转换中发生的溢出总是会导致编译时错误
存在值的运行时检查。int值从-21474048到+21474047(为什么?)。因此您会得到一个异常。对值进行运行时检查。int值从-21474048到+21474047(为什么?)。所以你得到了一个例外。
int.MinValue
不是-21474048
,它是-2147483648
@BoltClock来自内存,是吗?我犯了一个错误,但没关系int.MinValue
不是-21474048
,而是-2147483648
@BoltClock来自内存,是吗?我犯了一个错误,但实时计算所有书面表达式并不重要?如果“计算”是指“计算”,如果“实时”是指“在编译时”——那么(据我理解)是的。@Artur Keyan:任何表达式都可以计算为常量结果(即使用常量文字值)。如果你乘以一个像-1*someVar
这样的数字变量,它不会优化它。它是实时计算所有的书面表达式吗?如果“计数”是指“计算”,如果“实时”是指“编译时”—那么(据我所知)是的。@Artur Keyan:任何表达式都可以被计算为常量结果(即使用常量文字值)。如果你乘以一个像-1*someVar
这样的数字变量,它将不会优化它。