Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
C# 为什么int.MinValue%-1会导致和OverflowException_C#_Modulus_Overflowexception - Fatal编程技术网

C# 为什么int.MinValue%-1会导致和OverflowException

C# 为什么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

在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=+32768,超出了16位有符号整数的有效范围。

数学上
int.MinValue%-1
将为0或-1(或可能为1)。这不超过16位有符号整数的有效范围。但它通常是通过先除法,然后找到余数来计算的。同意,但语言规范要求这个顺序吗?我不知道。我有点惊讶C#处理得不好。详细说明注意,在Java中,结果是规范规定的
0
,在C中,操作调用未定义的行为。