有符号整数和无符号整数之间的区别是:
Unsigned值可以是一个较大的正数,而不能是负数。 Unsigned版本使用前导位作为值的一部分,而signed版本使用最左边的位来识别数字是正还是负。 有符号整数可以同时包含正数和负数。
还有其他区别吗?
有符号整数和无符号整数之间的区别是:
Unsigned值可以是一个较大的正数,而不能是负数。 Unsigned版本使用前导位作为值的一部分,而signed版本使用最左边的位来识别数字是正还是负。 有符号整数可以同时包含正数和负数。
还有其他区别吗?
当前回答
在嵌入式系统上编程时,必须使用无符号整数。在循环中,当不需要有符号整数时,使用无符号整数将节省设计此类系统所需的安全。
其他回答
除此之外,在C语言中,你不能溢出一个无符号整数;行为被定义为模算术。您可以溢出一个有符号整数,并且在理论上(尽管在当前主流系统上没有实践),溢出可能会触发一个错误(可能类似于除零错误)。
关于这个问题,我找到的最佳答案要感谢IBM引用的XDR标准:
Integer An XDR signed integer is a 32-bit piece of data that encodes an integer in the range [-2147483648,2147483647]. The integer is represented in two's complement notation. The most and least significant bytes are 0 and 3, respectively. The data description of integers is integer. Unsigned integer An XDR unsigned integer is a 32-bit piece of data that encodes a nonnegative integer in the range [0,4294967295]. It is represented by an unsigned binary number whose most and least significant bytes are 0 and 3, respectively. The data description of unsigned integers is unsigned.
参见维基百科上的XDR标准
(回答第二个问题)通过只使用符号位(而不是2的补码),你可以得到-0。不太漂亮。
在嵌入式系统上编程时,必须使用无符号整数。在循环中,当不需要有符号整数时,使用无符号整数将节省设计此类系统所需的安全。
这都是关于建模的: 当您想要设计一台计算机时,您需要采用约定来表示数据以及如何计算它们。当然,为不同的模型提供不同的操作和属性(性能、所需的内存空间、硬件实现复杂性等)。
事实证明,通过基于电学(因此是电子学)的计算,我们发现表示信息的最方便的方法是使用电压级别. ...计算这些电压水平最方便的方法是考虑两种状态:有电压和没有电压。 “bit”来了。
这就是为什么我们用二进制来表示数字:一系列高电压(1)或低电压(0)的电子引脚。
但是,如果使用二进制计数,则只能表示自然数(0,1,2,…)。正好是2^n (n是比特数)个数。
如果您确保第一个操作数大于第二个操作数,则允许您执行加法、乘法、除法和减法,如果检查结果不超过您拥有的比特数,则结束。
然后,一些聪明的家伙过来问:“当你用m >n做n - m时会发生什么,使用完全相同的算法?”
...实际情况是这样的:你只需要在你的数字上加上1,如果你在后面有进位(环绕),然后考虑这两个都是0…0和1…1代表0。这是1的补1的_complement 然而,这样做,你必须为符号保留一个位。从技术上讲,你可以表示-(2^(n-1)-1)≤n≤2^(n-1)-1的值 它们是:(2^n)-1(0的两种表示)。在这种表示中,你只需要交换所有的位来求负数。
然后,更聪明的家伙过来告诉我:“如果我们认为当我们对数字进行否定时,总是会有一个环绕呢?”……这意味着你在交换了比特之后再加一个。得到2的补2的补 使用它,你的0只有一个表示,你可以再次表示2^n个数字(2^(n-1)≤n≤2^(n-1)-1)。加上,a-b的计算实际上就是a+(-b),这只需要两种操作:add(a, add(swap(b), 1)))
2补的另一个好处是,加法算法和无符号算法是一样的。因此,您将获得相同的属性,并使用相同的硬件来完成这两项任务。这就是为什么它是大多数计算机使用的表示法。
简而言之,有符号和无符号可以表示相同的数字计数,但在不同的范围内,现在,您可以准确地知道其中的原因了。有关获得的代数结构的更多详细信息,请阅读此响应:https://stackoverflow.com/a/23304179/1745291
然后根据上下文使用一个或另一个(注意,对于某些操作,如<,强制转换时的处理是不同的:((signed) -1) < 5但((unsigned) -1) > 5