C#在内存中表示负整数的方式并将其转换为未选中状态

C#有各种值类型,每个都有自己的用途。 Int32的范围从 – (0x7FFFFFFF + 1)到0x7FFFFFFF,并且从我运行它的每台机器,似乎unchecked((int)0xFFFFFFFF)总是得到一个结果值-1。 总是这样吗? 此外,在任何系统上,.NET总是在内存中表示-1为0xFFFFFFFF吗? 领先位总是符号位吗? 是否总是使用Two’s Complement带符号的二进制表示forms的整数?

System.Int32的文档明确声明它存储在两个赞美forms中。 它位于最底层:

除了将单个整数用作十进制值之外,您可能希望使用整数值执行按位运算,或者使用整数值的二进制或hex表示。 Int32值以31位表示,第32位用作符号位。 通过使用符号和幅度表示来表示正值。 负值以二进制补码表示。 在对Int32值执行按位运算或使用单个位时,请务必记住这一点。 为了对任何两个非十进制值执行数值,布尔或比较操作,两个值必须使用相同的表示。

所以看来你所有问题的答案都是肯定的。

Int32的范围也是 – (0x80000000)到0x7FFFFFFFF。

C# – 以及这个星球上几乎所有其他的电脑 – 用2的补码表示整数。 我相信在某一点上,已经设计了使用其他表示的CPU,但是现在,你可以非常可靠地依赖于以2的补码表示法表示的整数。

  • 我们从右到左计数位,最右边的位,位0是最低有效位,最左边位是最重要的位。

  • 高阶(最左边)位是符号:0为正; 1是否定的。

  • 其余位带有值。 这意味着大小为N位的整数的有效域是 – (2 n-1 )<= x <= +(2 n-1 -1)。 也就是说,可以表示一个负数而不是正数:对于16位有符号整数,域为-32,768到+32,767。

将数字加成两个补码很容易:

  • 将其绝对值转换为二进制/ base-2表示法。
  • 如果值为负,
    • 反转位
    • 加1

因此,值+1表示为0x0001,而-1表示为

  • 0x0001(二进制的绝对值为1)
  • 0xFFFE(位反转)
  • 0xFFFF(加1)

或0xFFFF

二进制补码表示法的原因是它使CPU设计更简单:因为减法是负数的加法(例如3-2与3 + -2相同),它们不必设计减法电路:

  • 1-1与1 + -1相同并且评估为零。

  • 或以hex,

    0x0001 (decimal +1) + 0xFFFF (decimal -1) ====== 0x0000 (decimal 0) 

在大多数CPU上,进入或退出高阶位设置定点溢出标志。