考虑以下定义:
int x=5;
int y=-5;
unsigned int z=5;
它们是如何存储在内存中的?任何人都可以解释这些在内存中的位表示吗?
可以在内存int x=5
中int y=-5
具有相同的位表示吗?
考虑以下定义:
int x=5;
int y=-5;
unsigned int z=5;
它们是如何存储在内存中的?任何人都可以解释这些在内存中的位表示吗?
可以在内存int x=5
中int y=-5
具有相同的位表示吗?
ISO C 说明了不同之处。
数据类型是有符号的int
,最小范围至少为 -32767 到 32767(含)。实际值分别在limits.h
asINT_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 |
+---------------------+---------------------+---------------------+
请注意,正值对所有表示具有相同的编码,只有负值不同。
进一步注意,对于无符号值,您不需要使用其中一位作为符号。这意味着您可以在积极方面获得更大的范围(当然,以没有负面编码为代价)。
不,无论您使用哪种表示形式5
,-5
都不能具有相同的编码。否则,就没有办法区分。
顺便说一句,目前在 C 和 C++ 标准中都在采取行动,将二进制补码指定为负整数的唯一编码。
因为它只是关于内存,所以最后所有的数值都以二进制形式存储。
一个 32 位无符号整数可以包含从所有二进制 0 到所有二进制 1 的值。
当涉及到 32 位有符号整数时,这意味着它的一个位(最高有效位)是一个标志,它将值标记为正数或负数。
C 标准规定无符号数将以二进制形式存储。(带有可选的填充位)。带符号的数字可以存储为以下三种格式之一:大小和符号;二进制补码或一个补码。有趣的是,这排除了某些其他表示,例如Excess-n 或 Base -2。
然而,在大多数机器和编译器上,有符号数存储在 2 的补码中。
int
通常为 16 或 32 位。该标准规定,这 int
应该是对底层处理器最有效的任何东西,只要它是>= short
,<= long
然后它是标准允许的。
然而,在某些机器和操作系统上,历史int
并不是当前硬件迭代的最佳尺寸。
这是一个非常好的链接,它解释了 C 中带符号和无符号 INT 的存储 -
http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
取自上述文章 -
“称为二进制补码的过程用于将正数转换为负数。这样做的副作用是最高有效位用于告诉计算机数字是正数还是负数。如果最高有效位是 1,则数字为负数。如果为 0,则数字为正数。
假设 int 是一个 16 位整数(取决于 C 实现,现在大多数是 32 位),位表示不同,如下所示:
5 = 0000000000000101
-5 = 1111111111111011
如果将二进制 1111111111111011 设置为无符号整数,则它将是十进制 65531。