In arithmetic operations, if any of the operand is unsigned
, the other operand converts to unsigned
(if its signed
), and the result of the operations will be unsigned
also.
Also, casting unsigned
to signed
and then doing the operation doesn't change the bit representation of the operand. On a two's complement architecture (i.e almost every modern architecture), (int)x
has same bit representation as x
has, only their interpretation changes when calculating their value in decimal system. But the important point is that the arithmetic operation is performed on the bit representations (not on their values in decimal system). And since the casting doesn't change the bit representation, the bit representation of the result will also NOT change.
C++03 Standard says in §5/9:
Many binary operators that expect
operands of arithmetic or enumeration
type cause conversions and yield
result types in a similar way. The
purpose is to yield a common type,
which is also the type of the result.
This pattern is called the usual
arithmetic conversions, which are
defined as follows:
[...]
Otherwise, if either operand is
unsigned, the other shall be converted
to unsigned.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…