考虑以下定义:
int x=5;
int y=-5;
unsigned int z=5;
它们在内存中是如何存储的?有人可以解释一下它们在内存中的位表示吗?
int x=5
和int y=-5
在内存中是否可以具有相同的位表示?
考虑以下定义:
int x=5;
int y=-5;
unsigned int z=5;
它们在内存中是如何存储的?有人可以解释一下它们在内存中的位表示吗?
int x=5
和int y=-5
在内存中是否可以具有相同的位表示?
ISO C规定了它们之间的区别。
int
数据类型是有符号的,其最小范围至少为-32767到32767(包括)。实际值在limits.h
中分别给出为INT_MIN
和INT_MAX
。
unsigned int
具有0到65535(含)的最小范围,实际最大值来自同一头文件的UINT_MAX
。
除此之外,标准并不强制要求采用二进制补码表示编码值,这只是其中的一种可能性。对于使用16位数据类型的5和-5,三种允许的类型将具有以下编码:
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”不能具有相同的编码,否则就无法区分它们了。
另外,目前在C和C++标准中正在进行行动,以将二进制补码作为负整数的唯一编码。
因为一切都是关于内存的,最终所有的数值都以二进制形式存储。
一个32位无符号整数可以包含从二进制0到二进制1的所有值。
当涉及到32位有符号整数时,它意味着其中一位(最高位)是一个标志,标记该值是正数还是负数。
C标准指定无符号数将以二进制形式存储(带有可选的填充位)。有三种格式可以存储有符号数:大小和符号;二进制补码或一的补码。有趣的是,这排除了某些其他表示法,如Excess-n或Base-2。
然而,在大多数机器和编译器上,有符号数以二进制补码形式存储。
int
通常为16或32位。标准规定int
应该是底层处理器最有效的类型,只要它>= short
且<= long
,就符合标准。
在某些机器和操作系统上,历史原因导致int
不是当前硬件的最佳大小。
http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
从上面的文章中得知-
“使用称为二进制补码的过程将正数转换为负数。这样做的副作用是最高有效位用于告诉计算机数字是正数还是负数。如果最高有效位为1,则数字为负数。如果为0,则数字为正数。”
5 = 0000000000000101
-5 = 1111111111111011