有符号和无符号整数C ++的实现差异

时间:2017-01-23 10:39:56

标签: c++ integer implementation

我知道两个补充表示。我想知道intunsigned int之间的具体差异是什么。我会说那个

  1. 比较不同(符号位将改变比较的执行方式)。
  2. 乘法是不同的(我取模数,乘以这些模块,并根据两个操作数的符号补充结果)。
  3. 分裂不同(乘法的原因相同)。
  4. 加法和减法看起来相同
  5. 还有其他可能我不知道的差异吗?

1 个答案:

答案 0 :(得分:0)

我假设是双补码运算,因为这是最常见的。

有很多关于二进制补码算法的解释。例如,评论中的链接,此处为乘法:http://pages.cs.wisc.edu/~smoler/cs354/beyond354/int.mult.html

1:正确。比较通常与减法相同 - 但减法的结果将被丢弃,并且仅使用状态位。 Nit-pick:"<"和">"是不同的,但" =="和"!="是一样的。

2,3:是的,乘法和除法是不同的。

4:嗯,有点儿。结果的位模式是相同的,但有重要的区别。典型处理器上的add / sub指令设置溢出,进位,负和零的状态标志。所以我认为差异在于你如何解释结果而不是结果本身。这些状态位不可用于C / C ++程序,但由编译器生成的代码使用。

5:扩展。铸造到更广泛的类型是不同的。对于无符号积分,它们是"零扩展",而对于有符号积分,它们是"符号扩展"。符号扩展意味着它将复制窄类型的高位(符号位)以填充宽类型的附加位。

6:范围:例如,无符号8位的值范围是0 ... 255,而对于带符号的8位值,它是-128 ... + 127。

7:逐位操作"&"," |","〜"," ^"

是一样的

8:位移操作"<<&#;和">>":左移是相同的,但是右移是不同的,因为右移的符号值是符号扩展。