On Mon, Jun 2, 2008 at 9:48 PM, Scott Phuong <mycleanjunk@xxxxxxxxx> wrote: > > unsigned short a; > unsigned short b; > > a = 0xFFFF; > b = 0x3FC; > > a = (a + 1) % b; > printf ("A is 0x%x\n", a); > // I expect the answer to be 0 and it is not! It is 0x100. Why is this? > I bet if you did ++a; a %= b; you'd get 1. I don't know the exact rules, but 1 is an int, so a+1 will give you (int)a + 1, which will be 0x10000, which when modded by (int)b will not be 0. I'd have to read up on integral promotion to be sure, but I think the only way is to add an explicit cast. a = (unsigned short)(a+1) % b; (If you want to keep it one expression, and of that form. ++a, a %=b; is possible, as mentioned, and a = ( (a+1) & 0xFFFFu ) % b would also work.) HTH, ~ Scott