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

What method does the computer use to add unsigned integers

本文关键字:添加 无符号整数 方法 什么 计算机      更新时间:2023-10-16
int main(){
unsigned int num1 = 0x65764321; 
unsigned int num2 = 0x23657432;
unsigned int sum = num1 + num2;
cout << hex << sum;
return 0;
}

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

int sum = num1 + num2; 

计算机用什么方法添加它们,会不会是两个的补充。总和变量是否会打印在 2 的补码中。

就实际位而言,2 的补码加法与无符号加法相同。 在实际的硬件中,设计将是像 https://en.wikipedia.org/wiki/Carry-lookahead_adder 一样复杂的东西,因此它可以是低延迟(不必等待进位波纹到32位或64位,因为对于add来说,门延迟太多,不能成为单周期延迟。

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

例如,一个人的补码加法必须将带出包装回低位。 请参阅这篇关于优化 TCP 校验和计算的文章,了解如何在仅提供 2 的补码/无符号加法的硬件上实现补码加法。 (特别是 x86(。

C++将符号溢出作为未定义的行为,但真正的补码和符号/量级硬件确实具有特定的记录行为。 将unsigned位模式reinterpret_cast为有符号整数会给出一个结果,该结果取决于您运行的硬件类型。 (不过,所有现代硬件都是 2 的补充。


由于无符号或 2 的补码的按位运算是相同的,因此这完全取决于您如何解释结果。 在像 x86 这样的 CPU 体系结构上,根据指令的结果设置标志,溢出标志仅与有符号解释相关,而携带标志仅与无符号解释相关。 硬件从单个指令生成两者,而不是让单独的有符号/无符号添加指令执行相同的操作。

有关无符号携带与签名溢出以及 x86 标志的精彩文章,请参阅 http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt。


在其他架构(如 MIPS(上,没有 FLAGS 寄存器。 您必须使用比较或测试指令来弄清楚发生了什么(进位或零或其他(。add指令不设置标志。 请参阅此MIPS问答,了解32位MIPS上的64位附加功能。

但是为了检测签名溢出,add溢出时引发异常(x86 将在其中设置 OF(,因此如果您希望addu不会在签名溢出时出错,请使用 进行签名或无符号添加。


现在这里的溢出标志是 1(这是我们教练给出的示例(表示有溢出但没有携带,那么这里怎么会有溢出

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

如果您使用非优化编译器为 x86 编译此程序,并且它对您的两个输入使用了ADD指令,您将从该ADD指令中获得OF=1CF=0

但是编译器可能会使用lea edi, [rax+rdx]在不覆盖任一输入的情况下执行求和,并且LEA不会设置标志。

或者,如果编译器在编译时进行了添加,则代码的编译方式将与源代码相同,如下所示:

cout << hex << 0x88dbb753U;

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

我有两个无符号整数

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

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

总和变量是否会打印在 2 的补码中。

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