有符号整数与无符号整数

445

我正确地说无符号整数和有符号整数之间的区别是:

  1. 无符号整数可以容纳更大的正值,但不能存储负值。
  2. 无符号整数使用最高位作为值的一部分,而有符号版本使用最高位来标识数字的正负性。
  3. 有符号整数可以容纳正数和负数。

还有其他区别吗?


14
因为0既不是正数也不是负数,因此用术语“非负值”比用“正值”更加合适来表示无符号整数。 - Daniel
17个回答

5
(回答第二个问题)仅使用一个符号位(而不是2的补码),您可能会得到-0。看起来不太好看。

只是为了补充这个答案,基本上它意味着10 == 00,其中这两个数字都是二进制。 - user1462199

4
  1. 是的,无符号整数可以存储大值。
  2. 不,有不同的方法显示正负值。
  3. 是的,有符号整数可以包含正数和负数值。

3

无符号整数比有符号整数更容易陷入特定的陷阱。这个陷阱源于一个事实,即虽然上面的1和3是正确的,但两种类型的整数都可以被赋予超出其“容量”范围的值,并且它将被静默转换。

unsigned int ui = -1;
signed int si = -1;

if (ui < 0) {
    printf("unsigned < 0\n");
}
if (si < 0) {
    printf("signed < 0\n");
}
if (ui == si) {
    printf("%d == %d\n", ui, si);
    printf("%ud == %ud\n", ui, si);
}

当您运行此代码时,即使两个值分别被赋为-1并以不同的方式声明,您也将获得以下输出。
signed < 0
-1 == -1
4294967295d == 4294967295d

0

在嵌入式系统编程时,必须使用无符号整数。在循环中,如果不需要有符号整数,则使用无符号整数将节省设计此类系统所需的安全性。


0
在 C 语言中,有符号值和无符号值之间唯一的“保证”差异是有符号值可以是负数、0 或正数,而无符号值只能是 0 或正数。问题在于,C 语言没有定义类型的格式(因此您不知道您的整数是否为二进制补码)。严格来说,您提到的前两点是不正确的。

0
这篇文章是关于建模的: 当你想要设计一台计算机时,你需要采用一些约定来表示数据以及如何计算它们。当然,还需要提供不同的模型,具有不同的操作和属性(性能、所需内存空间、硬件实现复杂度等)。
事实证明,在基于电力(因此是电子学)的计算中,我们发现用电压水平来表示信息是最方便的方式。而处理这些电压水平最方便的方法是考虑两种状态:有电压和无电压。这就是“比特”的由来。
这就是为什么我们使用二进制来表示数字的原因:一系列带有高电压(1)或低电压(0)的电子引脚。
然而,如果你使用二进制进行计数,你只能表示自然数(0、1、2...)。恰好是2^n(其中n是你拥有的位数)个数字。
这使得你可以进行加法、乘法、除法和减法,但前提是你要确保第一个操作数大于第二个操作数,并且检查结果不会超过你拥有的位数。
然后,一些聪明的人想到了:“当你使用完全相同的算法进行n-m运算,其中m>n时会发生什么?”

...然后发生的事情是它实际上有点奏效:如果您在之后有一个进位(环绕),则只需将数字加一,然后考虑0…0和1…1都表示0。这就是补码Ones'_complement。 但是,这样做,您必须为符号保留一位。从技术上讲,您可以表示从-(2^(n-1)-1) ≤ n ≤ 2^(n-1)-1的值 它们是:(2^n)-1(0的两种表示)。在这种表示中,您只需交换所有位以否定数字。

然后更聪明的人告诉我们:“如果我们认为在对数字取反时总是有一个环绕呢?”……这意味着在交换位之后加上一。你就得到了2的补码Two's complement。使用它,你的零只有一个表示,而且你可以再次表示2^n个数字(其中2^(n-1) ≤ n ≤ 2^(n-1)-1)。此外,a-b的计算实际上只是a+(-b),它只需要两种操作:add(a, add(swap(b), 1)))

2的补码的另一个好处是,加法算法与无符号算法相同。因此,你可以获得相同的属性,并使用相同的硬件来执行两者。这就是为什么它是大多数计算机中使用的表示形式。

简而言之,signed和unsigned可以表示相同数量的数字,但范围不同,现在你知道了具体是哪些以及为什么。有关所获得的代数结构的更多详细信息,请阅读此回答:https://dev59.com/YnVC5IYBdhLWcg3wliKe#23304179 然后根据上下文使用其中之一(请注意,对于某些操作,如<,强制转换时处理方式不同:((signed) -1) < 5((unsigned) -1) > 5)。

0

我在这个问题上找到的最好的答案是感谢IBM引用了XDR标准

整数

XDR有符号整数是一个32位数据,它将一个整数编码在[-2147483648,2147483647]范围内。该整数以二进制补码表示。最高和最低有效字节分别为0和3。整数的数据描述是integer。

无符号整数

XDR无符号整数是一个32位数据,它将非负整数编码在[0,4294967295]范围内。它由一个无符号二进制数表示,其最高和最低有效字节分别为0和3。无符号整数的数据描述是unsigned。

请参阅Wikipedia上的XDR标准


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接