添加两个8位二进制补码10111011
和11010101
的结果是什么(以8位二进制形式),你将如何计算?
答案 0 :(得分:2)
这可能是任何体面的编程计算器都可以告诉你的东西,但假设它包裹在8位,这就是结果。
[ 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
答案 1 :(得分:0)
关于两个补码的好处是你不需要知道你是否有有符号或无符号的数字。只需获取二进制表示,添加并丢弃溢出位。如果你已经离开了可表示数字的范围,那么,运气不好。但是添加两个负数并得到一个正数会引起怀疑。
实际注意事项:不试图通过询问
之类的东西来防止C中的溢出a = b+c;
if (((b > 0) && (a < c)) || ((b < 0) && (a > c))) {
...
}
这可能适用于标准调试版本,但允许C(和C ++)编译器优化此检查。 (对于无符号算术,if (a >= (a+b)) { ... }
更常见,gcc -Wall
会警告它知道它是假的。这很好,因为C标准说溢出是未定义的行为。)< / p>
我不知道有限范围整数类型的其他语言的情况如何。