2021年4月20日(火) 9:14 konsolebox <konsole...@gmail.com>: > On Tue, Apr 20, 2021 at 2:08 AM Koichi Murase <myoga.mur...@gmail.com> wrote: > > AFAIK `1 << 31' causes undefined behavior when int is 32-bit signed > > integer. Instead, I think you may write `(int)(1u << 31)' for > > conforming C compilers. `u << 31' is defined for unsigned integers, > > and the conversion between signed and unsigned integers is defined to > > be made by mod 2^{32} (when int is 32 bits). > > Not sure how this should be done right so I decided to just change > 'flags' to unsigned int. > > - int flags; /* Flags associated with this word. */ > + unsigned int flags; /* Flags associated with this word. */
Yeah, right. I haven't checked the type of `flags'. We also need to make it unsigned if we want to use bit 31. In addition, you need to change `1 << 31' to `1u << 31'. The literal `1' has the type `(signed) int'. One needs to use `1u'---the literal of the type `unsigned int'. -- Koichi