考虑以下定义:
int x=5;
int y=-5;
unsigned int z=5;
它们如何存储在内存中?任何人都能解释这些在内存中的位表示吗?
int x=5
和int y=-5
可以在内存中使用相同的位代码吗?
答案 0 :(得分:42)
ISO C说明了差异。
int
数据类型已签名,其最小范围至少为-32767到32767(含)。实际值分别在limits.h
中显示为INT_MIN
和INT_MAX
。
unsigned 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
都不能具有相同的编码。否则,就没有办法分辨出来。
答案 1 :(得分:4)
C standard指定无符号数将以二进制形式存储。 (使用可选的填充位)。签名号码可以以三种格式之一存储:幅度和符号;两个补码或一个补码。有趣的是,它排除了某些其他表示形式,如Excess-n or Base −2。
然而,在大多数机器和编译器上存储2位补码的带符号数字。
int
通常为16位或32位。该标准规定int
应该是对底层处理器最有效的任何内容,只要它是>= short
和<= long
,那么标准允许它。
在某些计算机和操作系统上,历史记录导致int
不是当前硬件迭代的最佳大小。
答案 2 :(得分:3)
这是解释在C -
中存储有符号和无符号INT的非常好的链接http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
取自以上文章 -
“称为二进制补码的过程用于将正数转换为负数。这样做的副作用是,最重要的位用于告诉计算机数字是正数还是负数。如果最重要的位是1,则数字为负数。如果为0,则数字为正数。“
答案 3 :(得分:3)
因为它只是关于内存,所以最后所有数值都以二进制形式存储。
32位无符号整数可以包含从所有二进制0到所有二进制1的值。
当涉及到32位有符号整数时,它意味着它的一个位(最重要的)是一个标志,它将该值标记为正或负。
答案 4 :(得分:0)
假设int是16位整数(取决于C实现,现在大多数是32位),位表示不同如下:
5 = 0000000000000101
-5 = 1111111111111011
如果二进制1111111111111011设置为无符号整数,则为十进制65531。