This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: 1 << BITS_PER_UNIT


Richard Earnshaw <rearnsha@arm.com> writes:

>> It regards the use of (1 << BITS_PER_UNIT), usually when computing a
>> bit mask with (1 << BITS_PER_UNIT) - 1, when BITS_PER_UNIT is equal to
>> the number of bits in a HOST_LONG_INT.

> Or just use (2 << (BITS_PER_UNIT - 1))

> Same result, but no warning.

Did you run:

#include <stdio.h>
#define BITS_PER_UNIT 8
main() {
  printf("%x %x\n",
	 (1 << BITS_PER_UNIT) - 1,
	 (2 << (BITS_PER_UNIT - 1)));
}

It prints:

ff 100

They don't seem equal to me :-)

And, worse yet, no warning! :-D


AFAIK, shifts larger than promoted type of the shifted value produce
undefined results.  The C++ Standard states this, but I'm not sure
about C.  Anyway, we shouldn't rely on that...

If we can assume that the host int type is at least as large as
BITS_PER_UNIT, then we can make it portable by using:

  (((1 << (BITS_PER_UNIT - 1)) - 1) << 1) + 1

And, if we can't assume that, we might just abort the compilation,
saying that such (cross-)build is not supported.

-- 
Alexandre Oliva
mailto:oliva@dcc.unicamp.br mailto:oliva@gnu.org mailto:aoliva@acm.org
http://www.dcc.unicamp.br/~oliva
Universidade Estadual de Campinas, SP, Brasil



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]