Weird bit-shift behavior on void*.
Jascha Wetzel
firstname at mainia.de
Thu Aug 9 18:49:37 PDT 2007
C. Dunn wrote:
> I wish I could provide a testcase, but the problem is too weird:
>
> void* q = cast(void*)0x402A8000;
> writefln("%x %x %d %d %x %x", q, v, q.sizeof, v.sizeof, (cast(size_t)q >> 48),(cast(size_t)v >> 48));
>
> 'v' is a void* too. It is set during the program, and it is a real pointer address. According to the output, q and v have the same value and the same data-type size:
> 402A8000 402A8000 4 4 0 402a
> (This output comes directly from the writefln as shown.)
> So why do they have different bit-shifted results? The weird thing is, the bit-shift operand on 'v' is taken mod 32. It gives '0' for 'v >> 32' and repeats the previous sequence up to 'v >> 64', etc.
>
> But I cannot produce a testcase with this behavior because when I create a void* from the value of 'v' (e.g. 'q') I do not see the weird behavior. The issue is not '>>' v. '>>>'; I've tried both.
>
> The solution is to use (cast(ulong)v >> 48). (Again, '>>' v. '>>>' makes no difference.) Then I get:
> 402A8000 402A8000 4 4 0 0
> as expected. But the cast(size_t) on 'q' works fine.
>
> Does anyone have any idea what is going on here? It is very magical, and it cost me a TON of debug time.
did you try looking at the code DMD generates (using obj2asm or a debugger)?
More information about the Digitalmars-d
mailing list