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

时间:2015-05-28 03:39:46

标签: c# .net integer value-type

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

2 个答案:

答案 0 :(得分:8)

System.Int32的文档明确声明它以两个赞美形式存储。它位于最底层:

  

除了使用单个整数作为十进制值之外,还可以   可能想要用整数值执行按位运算,或者工作   使用整数值的二进制或十六进制表示。   Int32值以31位表示,第32位   用作符号位。正值表示使用   符号和大小的表示。负值是两个   补充表示。这一点很重要,请记住   对Int32值执行按位运算或使用时   个别位。为了执行数字,布尔或比较   对任意两个非十进制值的操作,两个值必须使用相同的值   表示。

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

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

答案 1 :(得分:5)

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相同并且评估为零。

  • 或十六进制,

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

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