41

考虑以下定义:

int x=5;
int y=-5;
unsigned int z=5;

它们是如何存储在内存中的?任何人都可以解释这些在内存中的位表示吗?

可以在内存int x=5int y=-5具有相同的位表示吗?

4

5 回答 5

49

ISO C 说明了不同之处。

数据类型是有符号的int,最小范围至少为 -32767 到 32767(含)。实际值分别在limits.hasINT_MIN和中给出INT_MAX

Anunsigned int的最小范围为 0 到 65535(含),实际最大值UINT_MAX来自同一个头文件。

除此之外,该标准不强制要求二进制补码符号对值进行编码,这只是其中一种可能性。三种允许的类型将具有以下 5 和 -5 的编码(使用 16 位数据类型):

        two's complement  |  ones' complement   |   sign/magnitude
    +---------------------+---------------------+---------------------+
 5  | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 |
-5  | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 |
    +---------------------+---------------------+---------------------+
  • 在二进制补码中,通过反转所有位然后加 1 得到一个负数。
  • 在一个的补码中,您通过反转所有位得到一个负数。
  • 在符号/幅度中,最高位是符号,因此您只需将其反转即可获得负数。

请注意,正值对所有表示具有相同的编码,只有负值不同。

进一步注意,对于无符号值,您不需要使用其中一位作为符号。这意味着您可以在积极方面获得更大的范围(当然,以没有负面编码为代价)。

不,无论您使用哪种表示形式5-5都不能具有相同的编码。否则,就没有办法区分。


顺便说一句,目前在 C 和 C++ 标准中都在采取行动,将二进制补码指定为负整数的唯一编码。

于 2010-09-28T11:16:10.150 回答
5

因为它只是关于内存,所以最后所有的数值都以二进制形式存储。

一个 32 位无符号整数可以包含从所有二进制 0 到所有二进制 1 的值。

当涉及到 32 位有符号整数时,这意味着它的一个位(最高有效位)是一个标志,它将值标记为正数或负数。

于 2017-04-18T05:18:18.747 回答
4

C 标准规定无符号数将以二进制形式存储。(带有可选的填充位)。带符号的数字可以存储为以下三种格式之一:大小和符号;二进制补码或一个补码。有趣的是,这排除了某些其他表示,例如Excess-n 或 Base -2

然而,在大多数机器和编译器上,有符号数存储在 2 的补码中。

int通常为 16 或 32 位。该标准规定,这 int应该是对底层处理器最有效的任何东西,只要它是>= short<= long然后它是标准允许的。

然而,在某些机器和操作系统上,历史int并不是当前硬件迭代的最佳尺寸。

于 2010-09-28T11:11:00.240 回答
3

这是一个非常好的链接,它解释了 C 中带符号和无符号 INT 的存储 -

http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O

取自上述文章 -

“称为二进制补码的过程用于将正数转换为负数。这样做的副作用是最高有效位用于告诉计算机数字是正数还是负数。如果最高有效位是 1,则数字为负数。如果为 0,则数字为正数。

于 2010-09-28T11:03:45.853 回答
0

假设 int 是一个 16 位整数(取决于 C 实现,现在大多数是 32 位),位表示不同,如下所示:

 5 = 0000000000000101
-5 = 1111111111111011

如果将二进制 1111111111111011 设置为无符号整数,则它将是十进制 65531。

于 2010-09-28T11:05:44.080 回答