c#在内存中表示负整数并对其进行不检查的强制转换的方式
本文关键字:不检查 方式 转换 内存 表示 整数 | 更新日期: 2023-09-27 17:50:54
c#有各种值类型,每种值类型都有自己的用途。Int32的范围从-(0x7FFFFFFF + 1)到0x7FFFFFFF,从我运行过的每台机器上,似乎未检查的((int)0xFFFFFFFF)总是给我一个结果值-1。总是这样吗?此外,在任何系统的内存中,.NET总是将-1表示为0xFFFFFFFF吗?前导位总是符号位吗?它是否总是使用二进制补码表示整数?
System的文档。Int32显式声明它以二进制的互补形式存储。它在最下面:
除了使用单个整数作为十进制值之外,您还可以可能想用整数值执行位运算,还是工作使用整数值的二进制或十六进制表示形式。Int32值用31位表示,其中包含32位用作符号位。正数值用。表示sign-and-magnitude表示。负值用两个单位表示补充表示。记住这一点很重要对Int32值执行位操作,或者在使用个人部分。以便执行数值、布尔值或比较对任意两个非十进制值进行操作,两个值必须使用相同的值表示。
看来你所有问题的答案都是肯定的。
Int32的范围从-(0x80000000)到0x7FFFFFFFF。
c#——以及地球上几乎所有其他计算机——用2的补码表示法表示整数。我相信,在某种程度上,已经有cpu设计使用其他表示法,但现在,你可以相当可靠地依赖于整数用2的补码表示法表示。
-
我们从右向左计数位,最右边的位,第0位是最低有效位,最左边的位是最高有效位。
-
高阶(最左边)位为符号:0为正;
-
剩余位携带该值。这意味着N位整数的有效定义域是-(2 N -1) <= x <= +(2 N -1-1)。也就是说,可以表示的负数比正数多一个:对于16位有符号整数,域是-32,768到+32,767。
把一个数写成2的补数很容易:
- 将其绝对值转换为二进制/base-2表示法。
- 如果值为负,
- 反转位
因此,值+1表示为0x0001,而-1表示为
- 0x0001(二进制中1的绝对值)
- 0xFFFE (bits倒置)
- 0xFFFF (add 1)
或0 xffff
使用2的补码表示法的原因是它使CPU设计更简单:因为减法是负数的加法(例如3-2与3 + -2相同),他们不需要设计减法电路:
-
1-1与1 + -1相同,计算结果为0。
-
或十六进制
0x0001 (decimal +1) + 0xFFFF (decimal -1) ====== 0x0000 (decimal 0)
在大多数cpu上,高阶位进位或进位将设置定点溢出标志。