On Fri, 25 Nov 2016, Torbjörn Granlund wrote:

Marc Glisse <marc.gli...@inria.fr> writes:

 Fixed. It was unhappy about (-13) << 2. I am a bit surprised it
 doesn't complain about (-13) >> 2 on the next line, we'll see if it
 ever becomes an issue.

This must be a compiler problem.  At least in C, shifting negative
integers is undefined.  It is a pity that it is, but the standard say
so.

I am less sure about C++.  Some googling did not provide a definitive
answer.

But if left shift of negative integers is undefined, surely right shift
is too!

Surprisingly, shifting negative numbers left is undefined, while
shifting them right it implementation-defined.


The value of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are 
zero-filled. If E1 has an unsigned type, the value of the result is E1 × 2^E2 , 
reduced modulo one more than the maximum value representable in the result type. 
Otherwise, if E1 has a signed type and non-negative value, and E1 × 2^E2 is 
representable in the corresponding unsigned type of the result type, then that value, 
converted to the result type, is the resulting value; otherwise, the behavior is 
undefined.

The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an 
unsigned type or if E1 has a signed type and a non-negative value, the value of the 
result is the integral part of the quotient of E1/2^E2 . If E1 has a signed type and 
a negative value, the resulting value is implementation-defined.

--
Marc Glisse
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to