Thanks for your explanation. I do understand now how '1 << 31' could cause
a potential problem.

On Fri, Jan 8, 2021 at 6:10 AM Nico Huber <[email protected]> wrote:

> Hi Harshit,
>
> On 08.01.21 01:35, Harshit Sharma wrote:
> > Although, I agree that 1u << 31 is much better, I believe 1 << 31 is not
> > wrong either as long as it is assigned to an 'unsigned int' as the
> compiler
> > performs an implicit conversion from a lower data type to a higher data
> > type ('int' to 'unsigned int' in this case).
>
> you are right about the implicit conversion, but this happens too
> late. The actual error may happen before the conversion. I guess
> mostly because of the way signed numbers are handled in assembler,
> compilers usually produce code that results in -2^31 for `1 << 31`.
> This -2^31 then implicitly converted to an unsigned is 2^31 which
> is what we usually intend.
>
> But the theoretical problem is what happens if the compiler produces
> code that does not result in -2^31 for the signed number. As the C
> standard implicitly says `1 << 31` is undefined, the compiler can
> basically do what it wants and would still be C compliant.
>
> Nico
>
_______________________________________________
coreboot mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to