Ciao!

Il 2020-09-30 09:03 ni...@lysator.liu.se ha scritto:
Marco Bodrato <bodr...@mail.dm.unipi.it> writes:
          limb = sp[sn];
          if (GMP_LIMB_BITS > CHAR_BIT || shift > 0)
            limb >>= bits - shift;
          else
            limb = 0;

Do we really need to support bits == GMP_LIMB_BITS here? If not, the

About mpn_set_str, the manual reads "base can vary from 2 to 256". Moreover we are fool enough to (unofficially) support "typedef unsigned char mp_limb_t;" in mini-gmp...

above 5 lines could be simplified to just

  limb = (sp[sn] >> 1) >> (bits - 1 - shift);

it should be safe in all cases.

I agree.

Anyway, there may be a problem only if we shift sp[sn] (unsigned char) or limb (possibly the same type) by 8 bits (if bits=8 and shift=0).

An even simpler solution could be to cast to unsigned int (at least 16 bits, right?) so:

  limb = (unsigned int) sp[sn] >> (bits - shift);

Maybe the cast is unnecessary, because the C standard says that the left operand of a shift operation is always promoted to (unsigned) int if it is smaller, correct? But it shouldn't be dangerous.

Ĝis,
m
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to