2017-01-23 151 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位平移操作 「< <」 和 「>>」:左移位是相同的,但是右移不同,因爲有符號值的右移做了符號擴展。