Максимальное значение переменных типа uint64
равно 2^64-1
(в Matlab, intmax('uint64')
), и когда вы выполняете операцию сложения, которая превышает это значение (переполнение), тогда результат равен 2^64-1
, поэтому ваш код не будет работать.
Например:
p1 = uint64(2^64-1) - 5;
p2 = uint64(10);
c1 = p1 + p2;
Результат c1
:
>> c1 =
uint64
18446744073709551615
, что 2^64-1
(а не 2^64-1 + 5
)
А Результат c1-p1
:
>> c1-p1
ans =
uint64
5
Но это должно было быть 10
Обход:
Вы можете проверить перед добавлением, будет ли переполнение, и если это так, вычислите остаток:
intmaxDif = intmax('uint64') - p1;
if(p2 >= intmaxDif)
c1 = p2 - intmaxDif;
else
c1 = p1 + p2;
end
Этот код будет выполнять добавление по модулю 2 к степени 64 между p1
и p2