Simple code below is wrong, even when forcing to long or unsigned long :
printf("%08x\n", ((~0) >> 1));
printf("%08x\n", (unsigned long)((~(unsigned long)0) >> 1));
printf("%08x\n", (long)((~(long)0) >> 1));
It prints
ffffffff while 7fffffff is expected.
I played a little bit with sources and
F:\tmp\tinycc\win32>diff ..\tcc.BAK ..\tcc.c
5559,5560c5559,5572
< l1 = (t1 == VT_LLONG) ? v1->c.ll : v1->c.i;
< l2 = (t2 == VT_LLONG) ? v2->c.ll : v2->c.i;
---
if (t1 == VT_LLONG) {
l1 = v1->c.ll;
} else {
l1 = v1->c.i;
l1 &= 0xffffffff;
}
if (t2 == VT_LLONG) {
l2 = v2->c.ll;
} else {
l2 = v2->c.i;
l2 &= 0xffffffff;
}