[cfe-dev] [llvm-dev] Unsigned Bitwise Shift for Bit-field Structure

Craig Topper via cfe-dev cfe-dev at lists.llvm.org
Wed Apr 19 19:28:43 PDT 2017


Adding the clang developer list and removing the llvm developer list. Clang
folks would be better for asking a C++ question such as this.

~Craig

On Wed, Apr 19, 2017 at 7:23 PM, Shiva Chen via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Hi,
>
> I have a question about unsigned bitwise shift.
>
> According the C99 6.5.7.4
>
> The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated
> bits are filled with zeros. 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.
>
> So if
>
> unsigned b = 0x80000000;
> unsigned a = b << 1;
> a will equal to 0 because a = (b << 1) mod (1<<32);
> (1<< 32) is UINT_MAX+1
>
> For the bit-field structure defined as
> struct foo
> {
>   unsigned long long b:40;
> } x;
>
> According to C99 6.7.2.1
> A bit-field is interpreted as a signed or unsigned integer type
> consisting of the specified number of bits.
> So the x.b will treat as 40 bit unsigned integer and it should follow
> 6.5.7.4.
>
> if x.b = 0x80000000 00;
> x.b << 1 = (x.b << 1) mod (1<<40)
> So x.b << 1 should be 0, right ?
>
> Please correct me if I miss understanding something.
>
> Thanks,
> Shiva
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170419/81f1dab6/attachment.html>


More information about the cfe-dev mailing list