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

Ana*_*mar 32 c unsigned-integer signed-integer

考虑这些定义:

int x=5;
int y=-5;
unsigned int z=5;
Run Code Online (Sandbox Code Playgroud)

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

int x=5int y=-5有相同的内存位表示?

pax*_*blo 43

ISO C说明了差异.

int数据类型是有符号的,并且具有通过包括32767中的至少一个-32767最小范围.实际值分别以limits.has INT_MIN和as 给出INT_MAX.

An 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 |
    +---------------------+---------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)
  • 在二进制补码中,通过反转所有位然后加1来得到数字的负数.
  • 在补码中,通过反转所有位得到负数.
  • 在符号/幅度中,最高位是符号,因此您只需将其反转即可得到负数.

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

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

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

  • 但它确实要求选择2的补码,1补码或符号幅度. (3认同)

小智 5

因为这一切都与内存有关,所以最终所有的数值都以二进制形式存储。

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

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


Sac*_*hag 3

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

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

摘自上述文章 -

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

  • 请注意,2 的补码并不是 C 实现允许的唯一有符​​号表示形式 - 补码和符号量值也是允许的。 (6认同)