为什么32位有符号整数最大值在c#中递增1后会变为最小值?

Aam*_*mir 0 c#

如果我有一个整数变量,其最大值被指定(2,147,483,647)为32位整数,如果我将它递增1,那么它将转为(-2147483648)负值

int i = int.MaxValue; // i = 2,147,483,647
i = i + 1;
Response.Write(i); // i = -2,147,483,648
Run Code Online (Sandbox Code Playgroud)

有人能解释一下吗?我没有找到值变化的确切原因.

Jon*_*eet 8

这只是整数溢出,其中值有效地泄漏到符号位.sbyte例如,用它推理就更简单了.将127和-127的按位表示视为带符号的字节:

 127: 01111111
-128: 10000000
Run Code Online (Sandbox Code Playgroud)

基本上,添加的执行就像具有无限范围一样,然后将结果截断为适当的位数,并根据其类型"解释"该值.

请注意,如果您在unchecked上下文中执行,则这就是全部.在checked上下文中,OverflowException将抛出一个.

从C#5规范的第7.8.4节开始:

checked上下文中,如果总和超出结果类型的范围,System.OverflowException则抛出a.在unchecked上下文中,不报告溢出,并且丢弃结果类型范围之外的任何重要高位.