将两个C ++函数转换为Pascal

时间:2016-01-16 23:59:04

标签: c++ pascal freepascal translate

我似乎无法理解为什么我的翻译没有给出理想的结果。这是C ++源代码:

#include <stdio.h>

int minint(int candidate = -1) {
  if (candidate - 1 >= 0)
    return candidate;
  for (int stride = -1, stride2 = 2*stride; ; stride = stride2, stride2 += stride2)
    if (stride2 >= 0 || candidate + stride2 >= 0)
      return minint(candidate + stride);
}

int maxint(int candidate = 1) {
  if (candidate + 1 <= 0)
    return candidate;
  for (int stride = 1, stride2 = 2*stride; ; stride = stride2, stride2 += stride2)
    if (stride2 <= 0 || candidate + stride2 <= 0)
      return maxint(candidate + stride);
}

int main() {
  (void) printf("Max int is %d\n", maxint());
  (void) printf("Min int is %d\n", minint());
  return 0;
}

打印:

Max int is 2147483647
Min int is -2147483648

这里是Pascal代码(使用Free Pascal编译):

program Translation;

function minint (candidate : Longint) : Longint;
    var stride, stride2 : Longint;
    var bool : Boolean;
    begin
        bool := false;
        if (candidate - 1) >= 0 then
        begin
            bool := true;
            minint := candidate;
        end;
        if (bool = false) then
        begin
            stride := -1;
            stride2 := 2*stride;
            while (stride2 < 0) and (candidate + stride2 < 0) do
            begin
                stride := stride2;
                stride2 += stride2;
            end;
            minint := minint(candidate + stride)
        end;
    end;

function maxint (candidate : Longint) : Longint;
    var stride, stride2 : Longint;
    var bool : Boolean;
    begin
        bool := false;
        if (candidate + 1) <= 0 then
        begin
            bool := true;
            maxint := candidate;
        end;
        if (bool = false) then
        begin
            stride := 1;
            stride2 := 2*stride;
            while (stride2 > 0) and (candidate + stride2 > 0) do
            begin
                stride := stride2;
                stride2 += stride2;
            end;
            maxint := minint(candidate + stride)
        end;
    end;

begin
    writeln(maxint(1));
    writeln(minint(-1));
end.

由于某种原因打印:

1073741825
2147483647

非常非常奇怪。 &#39; maxint&#39;价值大约是它所需要的一半,并且“minint&#39;价值是正的(实际上,它是&#39; maxint&#39;值应该是什么)。

我错过了什么?请记住,我被禁止使用序列发生器(即,诸如Exit之类的命令 - 因此是布尔值)和默认参数。

2 个答案:

答案 0 :(得分:3)

不要依赖C ++中的下溢/溢出行为。它是未定义的。
而是使用限制库来确定整数大小限制。

#include <iostream>
#include <limits>

int main() {
    std::cout << std::numeric_limits<int>::max() << '\n';
    std::cout << std::numeric_limits<int>::min() << '\n';
    return 0;
}

在Pascal中,LongInt具有固定大小 你可以依赖它长4个字节。

关于你的Pascal代码,你的&#34; maxint&#34;功能。

该行:

maxint := minint(candidate + stride)

应该是:

maxint := maxint(candidate + stride)

答案 1 :(得分:0)

这,IMO相当字面翻译(但不使用BreakContinueExit)适合我(注意:Delphi,不是FPC,但我想有一个兼容的模式在FPC中):

{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
function minint(candidate: Integer = -1): Integer;
var
  stride: Integer;
  stride2: Integer;
begin
  if candidate - 1 >= 0 then
    minint := candidate
  else
  begin
    stride := -1;
    stride2 := 2 * stride;
    while (stride2 < 0) and (candidate + stride2 < 0) do
    begin
      stride := stride2;
      stride2 := stride2 + stride2;
    end;
    minint := minint(candidate + stride);
  end;
end;

它产生以下输出:

Min int is -2147483648

我没有翻译maxint,但我想你可以自己做。

它看起来很像你的翻译(但没有bool)。