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

3
我了解二进制补码表示法。我想知道在实现上,int和unsigned int之间有哪些具体的区别。我会说:
  1. 比较是不同的(符号位将改变比较的执行方式)。
  2. 乘法是不同的(我取模,乘以这些模数,并根据两个操作数的符号对结果进行补码)。
  3. 除法是不同的(与乘法相同的原因)。
  4. 加法和减法看起来相同
还有其他我可能不知道的区别吗?

1
由于您特别标记了C ++,因此“unsigned int”会“环绕”,但对于“signed int”,溢出是未定义行为。 - BoBTFish
我认为它们之间唯一的区别是,int 是二进制补码,而 unsigned int 不是二进制补码,因此在 int 中,2^31 是负数,但在 unsigned int 中,2^31 是正数。对于小于 31 的幂,在 intunsigned int 中所有位都是正数。 - Mohsen_Fatemi
二进制补码并不是实现有符号整数的唯一方式,尽管有些人声称如此。现有的替代方案包括反码和原码。 - Peter
@Mohsen_Fatemi,你所有的链接和评论都是关于C的。OP明确标记了C++,你不能假设它们的行为是相同的。 - Simon Kraemer
据我所知:在C++中,有符号整数并没有规定必须使用特定的表示方法。 - Simon Kraemer
显示剩余5条评论
1个回答

0

我假设使用二进制补码算术,因为这是最常见的。

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

1:正确。比较通常与减法实现相同-但是减法的结果被丢弃,只使用状态位。挑剔一点:"<"和">"不同,但"=="和"!="相同。

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

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

5:扩展。将类型转换为更宽的类型是不同的。对于无符号整数,它们是“零扩展”,而对于有符号整数,它们是“符号扩展”。符号扩展意味着它将复制窄类型的高位比特(符号位)以填充宽类型的附加比特。

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

7:按位操作"&"、"|"、"~"和"^"是相同的

8:位移操作"<<"和">>":左移是相同的,但右移不同,因为有符号值右移会进行符号扩展。


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