gpt4 book ai didi

Delphi读取溢出标志

转载 作者:行者123 更新时间:2023-12-03 14:50:18 24 4
gpt4 key购买 nike

如果我这样做

var
a,b,c:cardinal;
begin
a:=$80000000;
b:=$80000000;
c:=a+b;
end;

c 将等于 0,因为加法溢出。捕获这个溢出 bool 值的最佳方法是什么? (a+b<a) or (a+b<b) ?一个非常好的方法是使用内联汇编器,但我在汇编器方面并不多产(尽管我猜测它会涉及类似 JO 的东西)

最佳答案

在汇编中,术语“溢出”通常指的是有符号算术,意味着和的符号与两个操作数的符号不同;对于无符号算术,术语进位更可取。

您可以在纯 Pascal 中使用溢出(进位)检查来实现加法:

// signed add - returns True if no overflow produced
function SAdd(A, B: integer; out C: integer): Boolean;
begin
C:= A + B;
Result:= (A xor B < 0) // operands have different signs
or (C xor A >= 0); // sum has the same sign as operands
end;

// unsigned add - returns True if no carry produced
function UAdd(A, B: Cardinal; out C: Cardinal): Boolean;
begin
C:= A + B;
Result:= (C >= A);
end;
<小时/>

装配中的相同功能 - Andreas 解决方案的优化变体:

// Signed Add
function SAdd(A, B: Integer; out C: Integer): Boolean;
asm
ADD EAX,EDX
MOV [ECX],EAX
SETNO AL
end;

// Unsigned Add
function UAdd(A, B: Cardinal; out C: Cardinal): Boolean;
asm
ADD EAX,EDX
MOV [ECX],EAX
SETNC AL
end;

关于Delphi读取溢出标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6418423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com