内存中的int32存储

3

关于int32存储 (c#), 我有一个问题。

32位表示int的最大数字为2^32。

2^32 = 4294967296, 如果你将其除以2,你就得到了int32的最大值:

4294967296 / 2 = -2147483648 to 2147483648

所以我原以为一半的位数用于负数,另一半用于正数。 但这不可能是真的,因为2^16 = 65536

现在我的问题:

实际上内存中是如何设置的?

我非常好奇你们的答案。


1
https://en.wikipedia.org/wiki/Two%27s_complement - Display Name
相当不错的问题。 但 Presius 是正确的。 基本上,由于整数可以保存负值,因此必须使用其内存中的一位来允许 -1 和 1 同时存在(例如)。 - Sayse
毫不意外,这已经发生过了。 - Jodrell
你只需要一个比特来表示符号,因此还有31个比特用于实际数字的表示。范围是-(2^31)2^31-1 - devnull69
1个回答

8
只有一位用于表示符号(负或正)
Int32 值用 31 位表示,第 32 位用作符号位。正值使用符号-幅度表示法表示。负值使用二进制补码表示法,MSDN
Int32.MaxValue =  2^31 - 1 = 01111111111111111111111111111111                
Int32.MinValue = -2^31     = 10000000000000000000000000000000

我找到了一篇好的文章,可以理解二进制补码在这里从二进制补码转换 以数字0xFFFFFFFF为例。在二进制中,它是:
1111 1111 1111 1111 1111 1111 1111 1111

关于这个数字,我们能说些什么呢?它的第一个(最左边)位是1,这意味着它代表的是一个负数。在二进制补码中就是这样:首位是1表示为负数,首位是0表示为0或正数。
为了找出这个数字的相反数,我们需要对其符号取反。但是如何实现呢?要想取反符号,只需将所有位取反(0变成1,1变成0),并将结果加1即可。
显然,该二进制数的反码为:
0000 0000 0000 0000 0000 0000 0000 0000

然后我们加一个。
0000 0000 0000 0000 0000 0000 0000 0001

“0xFFFFFFFF”的负数是“0x00000001”,更常被称为“1”。因此,“0xFFFFFFFF”等于“-1”。
“转换为二进制补码”
需要注意的是,这个过程可以反过来。如果你有一个-30的数,想要用二进制补码表示它,你需要先将30的二进制表示取反:
0000 0000 0000 0000 0000 0000 0001 1110

翻译:颠倒数字。
1111 1111 1111 1111 1111 1111 1110 0001

并且添加一个。
1111 1111 1111 1111 1111 1111 1110 0010

将文本翻译成中文:

转换回十六进制,这是0xFFFFFFE2

编辑,CPU如何使用二进制补码执行减法

CPU使用负数的二进制补码进行加法来执行减法。让我们以8位数字为例。我们想从七中减去四。

7 = 00000111
4 = 00000100

步骤1:通过将0转换为1,1转换为0来取00000100的倒数。
00000100 -> 11111011

步骤2:将倒数加1。
11111011
00000001
========
11111100

7 - 4 = 7 + (4的二进制补码)
00000111 (binary representation of 7)
11111100 (binary representation after Two's complement of 4)
========
00000011  (binary representation of 3)    

感谢您的好回答。但是为什么这个问题会这么“复杂”呢?既然有一个符号位,为什么不能像这样:value 2 = 0000 0000 0000 0000 0000 0000 0000 0010,value -2= 1000 0000 0000 0000 0000 0000 0000 0010。我猜不能这样做的原因是编译器计算位值的方式,我是对的吗? - Julian Herbold
这里讲得非常清楚,https://dev59.com/tFbTa4cB1Zd3GeqP_5XI - Adil
请检查我的更新答案,我已经添加了一个示例,展示了CPU如何使用二进制补码通过加法执行减法。 - Adil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接