> -----Original Message-----
> From: Leopold Toetsch [mailto:[EMAIL PROTECTED]
> Sent: Friday, May 07, 2004 3:59 AM
> To: [EMAIL PROTECTED]
> Subject: Re: [perl #29402] [BUG] 64-bit bitops
>
> > One particularly odd case:
>
> > _main:
> > set I1, 0xffffffff
> > shl I1, I1, 32
> > set I2, 0xffffffff
> > band I2, I2, I1
>
> What does
> print I2
> show here?
>
Revised:
_main:
set I1, 0xffffffff
shl I1, I1, 32
set I2, 0xffffffff
print I2 # prints -1
print "\n"
band I2, I2, I1
print I2 # prints -4294967296
print "\n"
new P1, 32
set P1, 2
set P1[0], I1
set P1[1], I2
sprintf S1, "%lx %lx\n", P1 # still prints ffffffff00000000 ffffffff00000000
print S1
end
Why would the decimal value of 0xffffffff be -1 with 64-bit ints? Is this a printf
problem or is the sign boundary actually at 0x000000007fffffff?
For reference, here's the C equivalent:
int main( )
{
long I1 = 0xffffffff;
long I2 = 0xffffffff;
I1 <<= 32;
printf( "%ld\n", I2 ); /* prints 4294967295 */
I2 = I1 & I2;
printf( "%ld\n", I2 ); /* prints 0 */
printf( "%lx %lx\n", I1, I2 ); /* prints ffffffff00000000 0 */
}