Det er ikke det samme tal.
0x20000000000 = 2199023255552 (dec.)
0x20000000 = 536870912 (dec.)
I hexadecimale systemer, prefixer man med 0. Det du gør nu, svarer til at gange tallet med 16 for hvert ekstra nul du sætter ind:
0x20000000 * 16 * 16 * 16 = 0x20000000000
I binær regner man med "implicitte" nuller foran værdien, eller rettere, man ignorere alle nuller foran det første betydende ciffer (det første 1 tal) derfor:
010 = 10
0000010 = 10
osv.
Derfor når du laver en binær AND operation mellem to tal af ulig bitlængde, forstår compileren/CPU'en/whatever det som om at der står nuller. Derfor, eks:
0x20000000000 & 0x20000000 =
0000000000000000000000100000000000000000000000000000000000000000 &
0000000000000000000000000000000000100000000000000000000000000000 =
----------------------------------------------------------------
0000000000000000000000000000000000000000000000000000000000000000 = NULL
Læg mærke til at dit 42 bit tal (0x20000000000) bliver prefixet med 64-42 = 22 nuller. Og dit 30 bit tal (0x20000000) bliver prefixet med 64-30 = 34 nuller.
Indlæg senest redigeret d. 27.12.2012 14:20 af Bruger #11328