2017-01-23 150 views
2

我知道两个补码表示法。我想知道在intunsigned int之间的具体差异是什么。我比执行有符号和无符号整数的区别C++

  1. 比较是不同的(符号位将改变如何执行比较)。
  2. 乘法是不同的(我取模数,乘这样的模块和基于两个操作数的符号补充结果)。
  3. 分区不同(乘法的原因相同)。
  4. 加减法看起来是一样的

是否有可能,我不知道有任何其他方面的差异?

+1

既然你特意标记了C++,'unsigned int'“wrap around”,但是'signed int'溢出的是未定义的行为。 – BoBTFish

+0

我认为它们之间的唯一区别是,“int”是二进制补码,而“unsigned int”不是二进制补码,所以'int'中的'2^31'是负数,而'unsigned int'中的'2^31' int'是一个正数,对于'int'和'unsigned int'中小于31的所有位是正数 –

+0

带符号的int用于表示负数和正数,因此 有符号整数的值范围为:-2147483648到2147483647 (无符号):0至4294967295. 有符号整数对于负值使用二进制补码。 例如8位有符号值(-1)表示为1111 1111.下一个规则用于负值表示:000 0001(invert) - > 1111 1110(加1) - > 1111 1111 – arturx64

回答

0

因为这是最常见的,所以我假定双补数算术。

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

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

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

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

5:扩展。铸造到更宽的类型是不同的。对于无符号整数,它们是“零扩展”,而对于有符号整数,它们是“符号扩展”。符号扩展意味着它将复制窄类型的高位(符号位)以填充宽类型的附加位。范围:例如,无符号8位的值范围为0 ... 255,而对于有符号的8位值,则为-128 ... + 127。

7:位运算 “&”, “|”, “〜” 和 “^” 是相同的

8位平移操作 “< <” 和 “>>”:左移位是相同的,但是右移不同,因为有符号值的右移做了符号扩展。