C# 为什么int.MinValue%-1会导致和OverflowException
在7.8.3中。关于余数运算符的C#规范规定如下: 如果左操作数是最小的int或long值,右操作数是 操作数为-1,将引发System.OverflowExceptionC# 为什么int.MinValue%-1会导致和OverflowException,c#,modulus,overflowexception,C#,Modulus,Overflowexception,在7.8.3中。关于余数运算符的C#规范规定如下: 如果左操作数是最小的int或long值,右操作数是 操作数为-1,将引发System.OverflowException 因此,int.MinValue%-1将导致OverflowException。我试图理解为什么?在two的补码算法中,数据类型的范围是(-2**n)到(2**n-1)(其中“n”比数据类型中的位数小1) 例如,16位有符号整数的有效范围为-32768(-2**15)到32767(2**15-1) -32768/-1=+327
因此,
int.MinValue%-1
将导致OverflowException。我试图理解为什么?在two的补码算法中,数据类型的范围是(-2**n)到(2**n-1)(其中“n”比数据类型中的位数小1)
例如,16位有符号整数的有效范围为-32768(-2**15)到32767(2**15-1)
-32768/-1=+32768,超出了16位有符号整数的有效范围。数学上
int.MinValue%-1
将为0或-1(或可能为1)。这不超过16位有符号整数的有效范围。但它通常是通过先除法,然后找到余数来计算的。同意,但语言规范要求这个顺序吗?我不知道。我有点惊讶C#处理得不好。详细说明注意,在Java中,结果是规范规定的0
,在C中,操作调用未定义的行为。