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=5和int 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)
请注意,正值对所有表示具有相同的编码,只有负值不同.
进一步注意,对于无符号值,您不需要使用其中一个位作为符号.这意味着你可以在积极的一面获得更多的射程(当然,代价是没有负面编码).
不,5并且-5无论您使用哪种表示形式,都不能使用相同的编码.否则,没有办法区分.
小智 5
因为这一切都与内存有关,所以最终所有的数值都以二进制形式存储。
一个 32 位无符号整数可以包含从所有二进制 0 到所有二进制 1 的值。
当涉及到 32 位有符号整数时,这意味着它的一个位(最重要的)是一个标志,它将值标记为正数或负数。
这是一个非常好的链接,它解释了 C 中带符号和无符号 INT 的存储 -
http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
摘自上述文章 -
“称为补码的过程用于将正数转换为负数。这样做的副作用是最高有效位用于告诉计算机该数是正数还是负数。如果最高有效位是 1,则数字是负数。如果是 0,则数字是正数。”