添加两个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