繁体   English   中英

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

[英]What is a difference between unsigned int and signed int in C?

考虑这些定义:

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 和 C++ 标准中都在采取行动,将二进制补码指定为负整数的唯一编码。

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

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

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

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

然而,在大多数机器和编译器上,以 2 的补码形式存储有符号数。

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

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

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

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

取自上述文章-

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

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

 5 = 0000000000000101
-5 = 1111111111111011

如果将二进制 1111111111111011 设置为无符号整数,则将是十进制 65531。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM