[PATCH 07/14] Cleanup: avoid undefined shift operation
Dirk Hohndel
dirk at hohndel.org
Wed Jan 3 07:28:37 PST 2018
> On Jan 3, 2018, at 7:23 AM, Jef Driesen <jef at libdivecomputer.org> wrote:
>
> On 29-12-17 08:00, Linus Torvalds wrote:
>> On Thu, Dec 28, 2017 at 4:35 PM, Dirk Hohndel <dirk at hohndel.org> wrote:
>>> unsigned int signbit = (1 << (n - 1));
>>> - unsigned int mask = (0xFFFFFFFF << n);
>>> + unsigned int mask;
>>> +
>>> + // shifting a 32bit constant by more than 31 bits has undefined behavior
>>> + if (n == 32)
>>> + mask = 0;
>>> + else
>>> + mask = (0xFFFFFFFF << n);
>> Ugh. That's ugly.
>> It's much simpler to just do
>> unsigned int mask = ~(signbit-1);
>> instead.
>> Yes, that mask ends up including the sign bit (the old mask did not),
>> but that doesn't matter for the end result.
>
> That's indeed an easier and nicer fix!
>
> The bitwise not can even be omitted from the mask, and moved to the return statements (where there is already both a mask and a ~mask).
I will update accordingly.
/D
More information about the devel
mailing list