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

Difference in implementation of signed and unsigned integers C++

本文关键字:实现 C++ 无符号整数 符号 整数      更新时间:2023-10-16

我知道双补表示。我想知道intunsigned int在实现方面的具体区别是什么。我宁愿说

  1. 比较不同(符号位将改变执行比较的方式)
  2. 乘法是不同的(我取模,乘以这样的模,并根据两个操作数的符号对结果进行补码)
  3. 除法不同(乘法的原因相同)
  4. 加法和减法看起来一样

还有其他我可能不知道的差异吗?

我假设两个补码算术,因为这是最常见的。

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

1:正确。比较的实现方式通常与减法相同,但减法的结果会被丢弃,只使用状态位。Nit pick:"<quot;以及">quot;是不同的,但是"=="answers"都是一样的

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

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

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

6:范围:例如,无符号8位的值范围为0…255,而有符号8位值的值范围是-128…+127

7:按位操作"&"&"&";,以及"^"是一样的

8:位移位操作"<lt"以及">gt":左移是相同的,但右移是不同的,因为右移的有符号值做符号扩展