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

考虑这些定义:

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

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

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

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都不能具有相同的编码。 否则,就没有办法分辨出来。

C标准规定无符号数将以二进制forms存储。 (使用可选的填充位)。 签名号码可以以三种格式之一存储:幅度和符号; 两个补码或一个补码。 有趣的是,它排除了某些其他表示,如Excess-n或Base -2 。

但是在大多数机器和编译器上都存储了2的补码。

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

在某些机器和操作系统上,历史记录导致int不是当前硬件迭代的最佳大小。

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

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

摘自以上文章 –

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

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

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

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

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

  5 = 0000000000000101 -5 = 1111111111111011 

如果二进制1111111111111011将设置为unsigned int,则为十进制65531。