int32存储在内存中

Jul*_*old 3 c# memory int32 bit

我有一个问题int32 storage (c#).

32位意味着int的最大数字是2 ^ 32.

2^32 = 4294967296,如果将它除以2,则得到int32的最大值:

4294967296 / 2 = -2147483648 to 2147483648
Run Code Online (Sandbox Code Playgroud)

所以我认为有一半是负数,另一半是正数.但那不可能是真的,因为2^16 = 65536.

现在我的问题:

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

我真的很好奇你的答案.

Adi*_*dil 8

只有一位用于符号(负数或正数)

Int32值以31位表示,第32位用作符号位.通过使用符号和幅度表示来表示正值.负值以二进制补码表示,MSDN

Int32.MaxValue =  2^31 - 1 = 01111111111111111111111111111111                
Int32.MinValue = -2^31     = 10000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

我找到了很好的文章来理解这里的两个补码.

从Two's补充转换

以数字0xFFFFFFFF为例.在二进制中,即:

1111 1111 1111 1111 1111 1111 1111 1111
Run Code Online (Sandbox Code Playgroud)

我们可以对这个数字说什么呢?它的第一个(最左边)位是1,这意味着它代表一个负数.这就是事物处于二进制补码的方式:前导1表示数字为负数,前导0表示数字为0或正数.

要查看此数字是否为负,我们将反转此数字的符号.但是怎么做呢?要反转符号,只需将这些位反转(0变为1,1变为0)并将结果加1.

显然,二进制数的反转是:

0000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

然后我们添加一个.

0000 0000 0000 0000 0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)

因此带来的负面0xFFFFFFFF就是0x00000001,更多的俗称1.所以0xFFFFFFFF-1.

转换为两个补语

请注意,这有两种方式.如果你有-30,并希望用2的补码表示它,你采用30的二进制表示:

0000 0000 0000 0000 0000 0000 0001 1110
Run Code Online (Sandbox Code Playgroud)

反转数字.

1111 1111 1111 1111 1111 1111 1110 0001
Run Code Online (Sandbox Code Playgroud)

并添加一个.

1111 1111 1111 1111 1111 1111 1110 0010
Run Code Online (Sandbox Code Playgroud)

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

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

CPU使用加两个负数的加法执行减法运算.让我们举一个8位数的例子.我们想从七减去4.

7 = 00000111
4 = 00000100
Run Code Online (Sandbox Code Playgroud) 两个'4的补充

步骤1通过将0转换为1并将1转换为0来取反义00000100

00000100 -> 11111011
Run Code Online (Sandbox Code Playgroud)

步骤2添加一个反转

11111011
00000001
========
11111100
Run Code Online (Sandbox Code Playgroud)

7-4 = 7 +(4的2的补码)

00000111 (binary representation of 7)
11111100 (binary representation after Two's complement of 4)
========
00000011  (binary representation of 3)    
Run Code Online (Sandbox Code Playgroud)