DWORD division Delphi / C++

DWORD division Delphi / C++

本文关键字:C++ Delphi division DWORD      更新时间:2023-10-16

因此,在C++中,我可以执行以下操作:

DWORD count;
count = 3 / 1.699999;
cout << count;

这将导致:

1

然而,Delphi抱怨Cardinal和Extended不匹配。

var
  count: DWORD;
begin
  count := 3 / 1.6;
  Writeln(inttostr(count));

因此,我必须对count := round(3 / 1.6)进行四舍五入,结果为:

2

或截断导致的CCD_ 2

1

trunk真的是该走的路吗?是否有编译器开关需要切换?

你可能会认为用谷歌搜索这样的东西很容易,但相信我,事实并非如此。

谢谢你抽出时间!

C/C++只有一个算术除法运算符/,但它的行为取决于传递给它的操作数类型。它可以执行整数除法浮点除法

Delphi有两个算术除法运算——div用于整数除法/用于浮点除法

您的C++代码正在执行浮点除法,然后将结果分配给不是浮点类型的DWORD,因此分配截断小数点:

1 / 1.6999991.764706920415836,它截断为1

在Delphi中,/运算符返回一个Extended,这是一种浮点类型。与C/C++不同,Delphi不允许将浮点类型直接分配给整型。您必须使用Round()Trunc()

在这种情况下,C++代码的Delphi等价物是使用Trunc():

var
  count: DWORD;
begin
  count := Trunc(3 / 1.699999);
  Write(IntToStr(count));

最简单的方法是使用trunc(3 /1.699999).

另一种方法是在除法之前使用前面的乘法。

var
  count: DWORD;
begin
  count := 3;
  count := (count*1000000) div 1699999;
  Writeln(inttostr(count));

当然,为了避免溢出,count应该<maxInt div 1000000