Перевод двух функций C ++ в Паскаль

Кажется, я не понимаю, почему мой перевод не дает желаемого результата. Вот исходный код 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

Очень, очень странно. Значение ‘maxint’ составляет приблизительно половину того, что должно быть, а значение ‘minint’ является положительным (фактически, это то, что предполагается значением ‘maxint’).

Что мне не хватает? Имейте в виду, что мне запрещено использовать секвенсоры (то есть такие команды, как Exit — отсюда и логическое значение) и аргументы по умолчанию.

1

Решение

НЕ ДЕЛАЙТЕ полагаться на поведение переполнения / переполнения в 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;
}

В Паскале LongInt имеет фиксированный размер.
Вы можете рассчитывать на его длину 4 байта.


Что касается вашего кода Pascal, у вас есть опечатка в вашей функции «maxint».

Линия:

maxint := minint(candidate + stride)

должно быть:

maxint := maxint(candidate + stride)
3

Другие решения

Это, IMO, довольно буквальный перевод (но без использования Break, Continue или же Exit) работает для меня (Примечание: 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).

0