C中的unsigned int和signed int有什么区别?

时间:2010-09-28 10:59:43

标签: c unsigned-integer signed-integer

考虑以下定义:

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

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

int x=5int y=-5可以在内存中使用相同的位代码吗?

5 个答案:

答案 0 :(得分:42)

ISO C说明了差异。

int数据类型已签名,其最小范围至少为-32767到32767(含)。实际值分别在limits.h中显示为INT_MININT_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 |
    +---------------------+---------------------+---------------------+
  • 在二进制补码中,通过反转所有位然后加1来得到数字的负数。
  • 在补码中,通过反转所有位得到数字的负数。
  • 在符号/幅度中,顶部位是符号,因此您只需将其反转即可得到负数。

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

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

不,无论您使用哪种表示形式,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。