计算机使用什么方法来添加无符号整数

时间:2017-08-25 13:09:59

标签: c++ assembly cpu-architecture

int counter = 0;
Set<String> handles = wd.getWindowHandles();
for (String windows : handles) {

    wd.switchTo().window(windows);

    Reporter.log(wd.getCurrentUrl());
    if (wd.getCurrentUrl().startsWith("https://www.airbnb.com")) {
        counter++;
        Reporter.log("Great Airbnb Leave Behind is Opening :" + wd.getCurrentUrl());
        Reporter.log("Airbnb &sharedid=3&iratid=9627& Passed on Parameter :"
                + wd.getCurrentUrl().contains("&sharedid=3&iratid=9627&"));
    }
    if (wd.getCurrentUrl().startsWith("http://local.summerrentals2017.com")) {
        counter++;
        Reporter.log("Main Site Listing Page :" + wd.getCurrentUrl());
    }
    if (wd.getCurrentUrl().startsWith("http://a.cdn.intentmedia.net/a1/exit_unit.html")) {
        counter++;
        Reporter.log("Intent media Is opend here is Opening :" + wd.getCurrentUrl());

    }
}
[...]
if (counter == handles.size()) {
    //do something
}

如果我有两个无符号整数,则说num1和num2。然后我告诉计算机未签名

int main(){
unsigned int num1 = 0x65764321; 
unsigned int num2 = 0x23657432;
unsigned int sum = num1 + num2;
cout << hex << sum;
return 0;
}

计算机使用什么方法添加它们,它是否是两个补充。 sum变量是否会以二进制补码打印。

2 个答案:

答案 0 :(得分:3)

就实际位而言,

2's complement加法与无符号加法相同。在实际的硬件中,设计将像https://en.wikipedia.org/wiki/Carry-lookahead_adder那样复杂,因此它可以是低延迟(不必等待进位在32或64位上波动,因为{门的延迟太多} {1}}为单周期延迟。)

一个补码和符号/幅度是C ++允许实现使用的其他有符号整数表示,它们的环绕行为与无符号不同。

例如,一个补码的加法必须将进位输回到低位。请参阅this article about optimizing TCP checksum calculation,了解如何在仅提供2的补码/无符号加法的硬件上实现补码。 (特别是x86)。

C ++将签名溢出作为未定义的行为,但实际的补充和符号/大小的硬件确实具有特定的记录行为。将add位模式reinterpret_cast转换为有符号整数会产生一个结果,该结果取决于您运行的硬件类型。 (但所有现代硬件都是2的补充。)

由于无符号或2的补码的按位运算相同,所以关于如何解释结果。在x86等基于指令结果设置标志的CPU架构上,溢出标志仅与签名解释相关,并且进位标志仅与无符号解释相关。硬件从单个指令生成,而不是使用单独的签名/无符号添加指令来执行相同的操作。

有关无符号进位与有符号溢出和x86标志的详细说明,请参见http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt

在其他架构上,如MIPS,没有FLAGS寄存器。您必须使用比较或测试指令来确定发生了什么(进位或零或其他)。 unsigned指令不设置标志。请参阅this MIPS Q&A about add-with-carry for a 64-bit add on 32-bit MIPS

但是为了检测签名溢出,add raises an exception on overflow(其中x86将设置为OF),因此如果您希望错误,则使用add进行有符号或无符号添加签名溢出。

  

现在这里的溢出标志是1(它是我们的教师给出的一个例子)意味着有溢出但没有进位,所以怎么会有溢出

你有一个C ++程序,而不是x86汇编语言程序! C ++没有进位或溢出标志。

如果您使用非优化编译器为x86编译了此程序,并且它在您的两个输入中使用了addu指令,那么您将从ADDOF=1获得CF=0ADD 1}}指令。

但编译器可能会使用lea edi, [rax+rdx]来完成总和而不会覆盖任何输入和LEA doesn't set flags

或者如果编译器在编译时进行了添加,那么您的代码将像源代码一样编译:

cout << hex << 0x88dbb753U;

并且在运行时不会添加您的号码。 (当然,如果你的编译器选择发出设置一个代码的代码,那么iostream库函数当然会有很多补充,甚至可能在add中的main()指令作为构建堆栈帧的一部分堆栈框架。)

答案 1 :(得分:1)

  

我有两个无符号整数

     

计算机使用什么方法添加它们

目标CPU架构上可用的任何方法。大多数都有一个名为ADD的指令。

  

sum变量是否会以两个补码打印。

两个补码是一种表示二进制整数类型的方法。这不是打印数字的方法。