<div dir="ltr">This test program prints 0. <div><br></div><div><div>#include <stdio.h></div><div><br></div><div>struct foo</div><div>{</div><div>  unsigned long long b:40;</div><div>} x;</div><div><br></div><div>int main() {</div><div>  foo f;</div><div>  f.b = 0x8000000000ULL;</div><div>  f.b <<= 1;</div><div>  printf("%llx\n", f.b);</div><div>  return 0;</div><div>}</div></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Wed, Apr 19, 2017 at 7:28 PM, Craig Topper <span dir="ltr"><<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Adding the clang developer list and removing the llvm developer list. Clang folks would be better for asking a C++ question such as this.</div><div class="gmail_extra"><span class="HOEnZb"><font color="#888888"><br clear="all"><div><div class="m_-7464533048109059033gmail_signature" data-smartmail="gmail_signature">~Craig</div></div></font></span><div><div class="h5">
<br><div class="gmail_quote">On Wed, Apr 19, 2017 at 7:23 PM, Shiva Chen via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I have a question about unsigned bitwise shift.<br>
<br>
According the C99 6.5.7.4<br>
<br>
The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated<br>
bits are filled with zeros. If E1 has an unsigned type, the value of<br>
the result is E1 × 2^E2, reduced modulo one more than the maximum<br>
value representable in the result type.<br>
<br>
So if<br>
<br>
unsigned b = 0x80000000;<br>
unsigned a = b << 1;<br>
a will equal to 0 because a = (b << 1) mod (1<<32);<br>
(1<< 32) is UINT_MAX+1<br>
<br>
For the bit-field structure defined as<br>
struct foo<br>
{<br>
  unsigned long long b:40;<br>
} x;<br>
<br>
According to C99 6.7.2.1<br>
A bit-field is interpreted as a signed or unsigned integer type<br>
consisting of the specified number of bits.<br>
So the x.b will treat as 40 bit unsigned integer and it should follow 6.5.7.4.<br>
<br>
if x.b = 0x80000000 00;<br>
x.b << 1 = (x.b << 1) mod (1<<40)<br>
So x.b << 1 should be 0, right ?<br>
<br>
Please correct me if I miss understanding something.<br>
<br>
Thanks,<br>
Shiva<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div>