2011-08-22 38 views

回答

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

...如果存在,溢出位将被设置。 ;) – Lucero

+0

我不得不手动添加溢出位。在'结束'后我添加'result [0] = carry'。我错过了什么吗? – 2013-01-18 22:20:46

+0

@詹姆斯,如果你只有8位,通常是位0到7,所以把'carry'放入'result [0]'是错误的。而且,如果你的位是1到8,result [0]的出现意味着你有_nine_位而不是8位。通常会发生什么结果将环绕,进位的最终值将表明这一点。 – paxdiablo

0

约补的好处是,你不需要知道你是否已签署或无符号数。只需取二进制表示,添加并丢弃溢出位。如果你已经离开了可表示数字的范围,好吧,好运气。但增加两个负数并获得正数应该引起怀疑。

在实践注意:不要尝试防止用C溢出通过询问之类的东西

a = b+c; 
if (((b > 0) && (a < c)) || ((b < 0) && (a > c))) { 
    ... 
} 

这将在标准调试版本可能工作,但C(和C++)编译器被允许优化此检查。 (这是更经常看到的无符号算术,if (a >= (a+b)) { ... }gcc -Wall将提醒它知道这是错误的,这是好的,因为C标准说溢出是不确定的行为。)

我不知道在范围有限的整数类型的其他语言中情况如何。