【问题标题】:int32 storage in memory [duplicate]内存中的int32存储[重复]
【发布时间】:2014-03-31 11:11:55
【问题描述】:

我有一个关于 int32 storage (c#) 的问题。

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

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

4294967296 / 2 = -2147483648 to 2147483648

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

现在我的问题:

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

我真的很好奇你的答案。

【问题讨论】:

  • 格式很好的问题.. 但普雷修斯是对的。基本上,由于整数可以保存负值,因此必须使用它在内存中的一个位来允许 -1 和 1 同时存在(例如)
  • 不出所料,这已经出现过。
  • 符号只需要一位,所以剩下31位来表示实际数字。范围是-(2^31)2^31-1

标签: c# memory bit int32


【解决方案1】:

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

Int32 值以 31 位表示,其中 30 秒位 用作符号位。正值通过使用表示 符号和大小表示。负值是二进制 补码表示,MSDN

Int32.MaxValue =  2^31 - 1 = 01111111111111111111111111111111                
Int32.MinValue = -2^31     = 10000000000000000000000000000000

我找到了一篇很好的文章来了解两者的补码here

二进制补码转换

以号码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,并且想用 2 的补码表示它,你就取 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 中减去 4。

7 = 00000111
4 = 00000100
2' 补码 4

第 1 步通过将 0 转换为 1 并将 1 转换为 0 来取 00000100 的倒数

00000100 -> 11111011

第 2 步逆加一

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 我猜它不能这样的原因是编译器计算位值,对吗?
  • 检查我更新的答案,我添加了一个示例,显示 CPU 如何使用二进制补码执行加法减法。
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 2018-12-09
  • 2015-06-13
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 2011-05-28
相关资源
最近更新 更多