Here is a conjecture:
For expression a op b
where a
and b
are of the same unsigned integral type U
, and op
is one of the compound assignment operators (+=
,-=
,*=
,/=
,%=
,&=
,|=
,^=
,<<=
,>>=
), the result is computed directly in the value domain of U
using modular arithmetic, as if no integral promotions or usual arithmetic conversions, etc. are performed at all.
Is this true? What about signed integral types?
To clarify: By definition integral promotions and usual arithmetic conversions do apply here. I'm asking if the result is the same as not applying them.
I'm looking for an answer in C++, but if you can point out the difference with C, it would also be nice.
Counter example:
int
has width 31
plus one bit for sign, unsigned short
has width 16
. With a
and b
of type unsigned short
, after integral promotions, the operation is performed in int
.
If a
and b
have value 2^16 - 1
, then the mathematical exact result of a * b
in the natural numbers would be 2^32 - 2^17 + 1
. This is larger than 2^31 - 1
and therefore cannot be represented by int
.
Arithmetic overflow in signed integral types results in undefined behavior. Therefore a *= b
has undefined behavior. It would not have this undefined behavior if unsigned arithmetic modulo 2^width(unsigned short)
was used.
(Applies to all C and C++ versions.)