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
这样的数字变量,它将不会优化它。