Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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# 在已检查和未检查的上下文中编译_C# - Fatal编程技术网

C# 在已检查和未检查的上下文中编译

C# 在已检查和未检查的上下文中编译,c#,C#,j的值是多少 Int32 i = Int32.MinValue; Int32 j = -i; 在选中的上下文中编译将引发异常。 在unchecked中,我们获得valueInt32.MinValue 但为什么会这样呢?以下是Int32的最小值和最大值: Dec Bin (first bit is a sign bit) Int32.MinValue -2147483648 10000000000000000000000000000000

j
的值是多少

Int32 i = Int32.MinValue;
Int32 j = -i;
在选中的上下文中编译将引发异常。
在unchecked中,我们获得value
Int32.MinValue


但为什么会这样呢?

以下是Int32的最小值和最大值:

                   Dec         Bin (first bit is a sign bit)
Int32.MinValue  -2147483648  10000000000000000000000000000000
Int32.MaxValue   2147483647  01111111111111111111111111111111
当您试图通过显式溢出检查获取
-(-2147483648)
时,在这种情况下会出现异常,因为
2147483648
大于int-type的最大允许值

那么,当允许溢出时,为什么要获取最小值?因为当Int32.MinValue被求反时,您得到的是
2147483648
,它具有二进制表示形式
100000000000000000000000000000
,但对于有符号整数,第一位是符号位,所以您得到的正是Int32.Min值

所以,这里的问题是把第一位当作数字符号。如果将求反的Int32.Min值的结果赋给无符号整数,则会得到
2147483648
值,如预期的那样:

Int32 i = Int32.MinValue;
UInt32 j = (UInt32)-i; // it has 32 bits and does not treat first bit as sign

以下是最小和最大Int32值:

                   Dec         Bin (first bit is a sign bit)
Int32.MinValue  -2147483648  10000000000000000000000000000000
Int32.MaxValue   2147483647  01111111111111111111111111111111
当您试图通过显式溢出检查获取
-(-2147483648)
时,在这种情况下会出现异常,因为
2147483648
大于int-type的最大允许值

那么,当允许溢出时,为什么要获取最小值?因为当Int32.MinValue被求反时,您得到的是
2147483648
,它具有二进制表示形式
100000000000000000000000000000
,但对于有符号整数,第一位是符号位,所以您得到的正是Int32.Min值

所以,这里的问题是把第一位当作数字符号。如果将求反的Int32.Min值的结果赋给无符号整数,则会得到
2147483648
值,如预期的那样:

Int32 i = Int32.MinValue;
UInt32 j = (UInt32)-i; // it has 32 bits and does not treat first bit as sign

这是整数溢出的一个例子。在选中的上下文中,整数溢出将被检测并转换为异常,因为语言设计者决定这样做

为了解释整数溢出,您可以手工用二进制进行计算。要计算-X,以二进制形式取X,将所有的1改为0,0改为1,然后加1(数字1,不是1位)

示例:5=000000000000000000000000101 翻转所有位:11111111111111111111 010 添加一个:11111111111111111111111111111 011,即-5 Int32.MinValue=100000000000000000 翻转所有位:011111111111111111111111 添加一个:100000000000000000000000
如果取Int32.MinValue并取反,则它不会改变-Int32.MinValue无法装入int-如果装入-(Int64)Int32.MinValue,它将按预期工作。

这是整数溢出的一个示例。在选中的上下文中,整数溢出将被检测并转换为异常,因为语言设计者决定这样做

为了解释整数溢出,您可以手工用二进制进行计算。要计算-X,以二进制形式取X,将所有的1改为0,0改为1,然后加1(数字1,不是1位)

示例:5=000000000000000000000000101 翻转所有位:11111111111111111111 010 添加一个:11111111111111111111111111111 011,即-5 Int32.MinValue=100000000000000000 翻转所有位:011111111111111111111111 添加一个:100000000000000000000000
如果取Int32.MinValue并取反,则它不会改变-Int32.MinValue无法装入int-如果装入-(Int64)Int32.MinValue,它将按预期工作。

但为什么不呢。。。请参阅有关按位编码和2-s补码的教程。因为
Int32
没有足够的位来容纳
-Int32。MinValue
我知道这是一种非常典型的类型,而且是正确的。我只是想更深入地理解这一点,但为什么不呢。。。请参阅有关按位编码和2-s补码的教程。因为
Int32
没有足够的位来容纳
-Int32。MinValue
我知道这是一种非常典型的类型,而且是正确的。我只是想更深入地理解这一点