C#具有各种值类型,每种类型都有自己的用途。 Int32的范围从 - (0x7FFFFFFF + 1)到0x7FFFFFFF,并且从我运行它的每台机器,似乎unchecked((int)0xFFFFFFFF)总是得到一个结果值-1。总是这样吗?此外,在任何系统上,.NET总是在内存中表示-1为0xFFFFFFFF吗?领先位总是符号位吗?是否总是使用Two's Complement带符号的二进制表示来表示整数?
答案 0 :(得分:8)
System.Int32的文档明确声明它以两个赞美形式存储。它位于最底层:
除了使用单个整数作为十进制值之外,还可以 可能想要用整数值执行按位运算,或者工作 使用整数值的二进制或十六进制表示。 Int32值以31位表示,第32位 用作符号位。正值表示使用 符号和大小的表示。负值是两个 补充表示。这一点很重要,请记住 对Int32值执行按位运算或使用时 个别位。为了执行数字,布尔或比较 对任意两个非十进制值的操作,两个值必须使用相同的值 表示。
所以看来你所有问题的答案都是肯定的。
Int32的范围也是 - (0x80000000)到0x7FFFFFFFF。
答案 1 :(得分:5)
我们计算从右到左的位,最右边的位,位0是最低有效位,最左边位是最重要的位。
高阶(最左边)位是符号:0为正; 1是否定的。
其余位带有值。这意味着大小为N位的整数的有效域是 - (2 n-1 )< = x< = +(2 n-1 -1) 。也就是说,可以表示一个负数而不是正数:对于16位有符号整数,域为-32,768到+32,767。
将数字加成两个补码很容易:
因此,值+1表示为0x0001,而-1表示为
或0xFFFF
二进制补码表示法的原因是它使CPU设计更简单:因为减法是负数的加法(例如3-2与3 + -2相同),所以它们不必设计减法电路:
1-1与1 + -1相同并且评估为零。
或十六进制,
0x0001 (decimal +1)
+ 0xFFFF (decimal -1)
======
0x0000 (decimal 0)
在大多数CPU上,进入或退出高位位会设置定点溢出标志。