I'm learning C programming and this is my problem. I feel like I've learned the macro topic in C but I guess I'm not quite ready yet.

```
#define PGSIZE    4096 
#define CONVERT(sz)    (((sz)+PGSIZE-1) & ~(PGSIZE-1))

printf("0x%x", CONVERT(0x123456));

```

Here is the problem. My expected output is `0x100000000000` but it prints `0x124000`.

```
((sz)+PGSIZE-1) = (0x123456)+4096-1 
                = (0x123456)+(0x1000 0000 0000) - 1 //4096 is 2^12
                =  0x1000 0012 3456 - 1
                =  0x1000 0012 3455

~(PGSIZE-1) => ~(0x0111 1111 1111) = 0x1000 0000 0000

((sz)+PGSIZE-1) & ~(PGSIZE-1) = (0x1000 0012 3455) & (0x1000 0000 0000)
                              = 0x100000000000

```

But when I ran the program, it prints 0x124000. 

What am I doing wrong?