添加兩個8位二進制補碼10111011
和11010101
的結果(以8位二進制數表示)是什麼結果?您將如何計算它?添加兩個8位二進制補碼
0
A
回答
2
這可能是任何體面的編程計算器可以告訴你的東西,但假設它以八位包裝,這就是結果。
[ hex,unsigned,signed]
10111011 [0xBB, 187, -69]
+ 11010101 [0xD5, 213, -43]
--------
= (1)10010000 [0x90, 144, -112]
您可以手動執行此操作過程如下:
set carry to zero
for each position starting at right side, progressing left:
set sum to carry
add bit from position in first number to sum
add bit from position in second number to sum
if sum is greater than one:
subtract two from sum
set carry to one
else
set carry to zero
end if
store sum to position of result
end for
0
約補的好處是,你不需要知道你是否已簽署或無符號數。只需取二進制表示,添加並丟棄溢出位。如果你已經離開了可表示數字的範圍,好吧,好運氣。但增加兩個負數並獲得正數應該引起懷疑。
在實踐注意:不要不嘗試防止用C溢出通過詢問之類的東西
a = b+c;
if (((b > 0) && (a < c)) || ((b < 0) && (a > c))) {
...
}
這將在標準調試版本可能工作,但C(和C++)編譯器被允許優化此檢查。 (這是更經常看到的無符號算術,if (a >= (a+b)) { ... }
和gcc -Wall
將提醒它知道這是錯誤的,這是好的,因爲C標準說溢出是不確定的行爲。)
我不知道在範圍有限的整數類型的其他語言中情況如何。
相關問題
- 1. 7位二進制補碼
- 2. 16位二進制補碼
- 3. 8位二進制代碼
- 4. One的二進制補碼8位有符號的大小,以二進制
- 5. 8位二進制加法
- 6. 二進制補碼
- 7. 二進制補碼stm32 c
- 8. 二進制補碼算術
- 9. std_logic_vector的二進制補碼
- 10. 二進制補碼錶示
- 11. 二進制補碼查詢
- 12. 二進制補碼轉換
- 13. 二進制補碼減法
- 14. 將十六進制轉換爲二進制和16位二進制補碼
- 15. 十進制數的二進制補碼
- 16. VERILOG:如何找到一個5位數的二進制補碼
- 17. 如何獲得int的32位二進制補碼位模式?
- 18. 使用Perl腳本來計算8位整數的二進制補碼
- 19. 二進制補碼檢測溢出與進位
- 20. 使用二進制補碼進行按位相減的溢出
- 21. 加入一個16位有符號整數(二進制補碼)的MSB和LSB
- 22. 基數的二進制補碼二進制數
- 23. 用二進制補碼查找二進制數,C
- 24. 在二進制中設置二進制補碼
- 25. 二進制中最小的二進制補碼
- 26. 帶分數的二進制數的二進制補碼
- 27. 限制二進制輸出爲8位
- 28. 8位2的補碼11010110的十進制值是多少?
- 29. 什麼是二進制補碼整數?
- 30. 在Python中使用二進制補碼
...如果存在,溢出位將被設置。 ;) – Lucero
我不得不手動添加溢出位。在'結束'後我添加'result [0] = carry'。我錯過了什麼嗎? – 2013-01-18 22:20:46
@詹姆斯,如果你只有8位,通常是位0到7,所以把'carry'放入'result [0]'是錯誤的。而且,如果你的位是1到8,result [0]的出現意味着你有_nine_位而不是8位。通常會發生什麼結果將環繞,進位的最終值將表明這一點。 – paxdiablo