繁体   English   中英

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

[英]Difference in implementation of signed and unsigned integers C++

我知道两个补码的表示形式。 我想知道intunsigned int之间在实现方面有什么细节差异。 我会说

  1. 比较是不同的(符号位将改变执行比较的方式)。
  2. 乘法是不同的(我采用模数,将这样的模块相乘,然后根据两个操作数的符号对结果求和)。
  3. 除法不同(乘法的相同原因)。
  4. 加减法看起来一样

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

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

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

1:正确。 比较通常以与减法相同的方式实现-但减法的结果将被丢弃,仅使用状态位。 Nit-pick:“ <”和“>”不同,但是“ ==”和“!=“相同。

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

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

5:扩展 转换为更广泛的类型是不同的。 对于无符号积分,它们是“零扩展”,而对于有符号积分,它们是“符号扩展”。 符号扩展意味着它将复制窄型的高位(符号位)以填充宽型的其他位。

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

7:按位运算符“&”,“ |”,“〜”和“ ^”相同

8:移位操作“ <<”和“ >>”:左移相同,但右移与带符号的值不同,右移执行符号扩展。

暂无
暂无

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

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