void biglsh(unsigned s, unsigned vn[], unsigned const v[], int n)
{
for (int i = n - 1; i > 0; i--)
- vn[i] = (v[i] << s) | ((unsigned long long)v[i - 1] >> (32 - s));
+ vn[i] = ((unsigned long long)v[i] << s) | (v[i - 1] >> (32 - s));
vn[0] = v[0] << s;
}
```
uint64_t dig2 = ((uint64_t)un[j + n] << 32) | un[j + n - 1];
if (un[j+n] >= vn[n-1]) {
// rhat can be bigger than 32-bit when the division overflows,
- rhat = dig2 - UINT32_MAX * vn[n - 1];
+ rhat = dig2 - (uint64_t)UINT32_MAX * vn[n - 1];
} else {
qhat = dig2 / vn[n - 1]; // 64/32 divide
rhat = dig2 % vn[n - 1]; // 64/32 modulo
vn[0] = v[0] << s;
}
-long bigdiv(unsigned v, unsigned q[], unsigned const u[], int m)
+unsigned long bigdiv(unsigned v, unsigned q[], unsigned const u[], int m)
{
- long long k = 0; // the case of a
+ unsigned long long k = 0; // the case of a
for (int j = m - 1; j >= 0; j--)
{ // single-digit
unsigned long d2 = (k << 32) | u[j];
unsigned *un, *vn; // Normalized form of u, v.
unsigned long long qhat; // Estimated quotient digit.
unsigned long long rhat; // A remainder.
- long long k;
int s, j;
if (m < n || n <= 0 || v[n - 1] == 0)
if (n == 1)
{ // Take care of
- k = bigdiv(v[0], q, u, m);
+ unsigned long k = bigdiv(v[0], q, u, m);
if (r != NULL)
r[0] = k;
return 0;
{
// rhat can be bigger than 32-bit when the division overflows,
// so rhat's computation can't be folded into divrem_64_by_32
- rhat = dig2 - qr.q * vn[n - 1];
+ rhat = dig2 - (uint64_t)qr.q * vn[n - 1];
}
again:
// use 3rd-from-top digit to obtain better accuracy