On 10/12/16 09:52, Luc Van Oostenryck wrote: > A compound assignment like, for example: > x /= a; > should have the same effect as the operation followed by the > assignment except that the left side should only be evaluated > once. So the statement above (assuming 'x' free of side-effects) > should have the same effect as: > x = x / a; > > In particular, the usual conversions should applied. So, if the > type of 'x' and 'a' is, respectively, 'unsigned int' (32 bit) and > 'long' (64 bit), the statement above should be equivalent to: > x = (unsigned int) ((long) x / a); > > But what is really done currently is something like: > x = x / (unsigned int) a; > In other words, the left-hand side is casted to the same type as the > rhs and the operation is always done with this type, neglecting the > usual conversions and thus forcing the operation to always be done > with the rhs type, here 'unsigned int' instead of 'long'. I have read this paragraph repeatedly, but I just can't understand what you are saying, unless I swap left-hand-side for right-hand-side and vice-versa. :-P > For example, with the values: > unsigned int x; ^^^^^^^^^^^^^^^ unsigned int x = 1; > long a = -1; > > We have: > x = 1 / (unsigned int) (-1); > x = 1 / 0xffffffff; > x = 0; > instead of the expected: > x = (unsigned int) (1L / -1L); x = (unsigned int) ((long)1 / -1L); > x = (unsigned int) (-1L); > x = 0xffffffff; > ATB, Ramsay Jones -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html