Behavior of increment operator at bounds for char

2019-02-26 13:57发布

I wonder how C++ behaves in this case:

char variable = 127;
variable++;

In this case, variable now equals to -128. However did the increment operator wrapped the value to its lower bound or did an overflow occurred?

Thanks in advance!

2条回答
贼婆χ
2楼-- · 2019-02-26 14:31

Plain char can be either signed or unsigned. If the maximum value is 127, then it must be signed in your implementation.

For unsigned types, "overflow" is well defined, and causes wraparound. For signed types, the behavior on arithmetic overflow is undefined (wraparound is typical, but not required). But that actually doesn't apply in this particular case; instead, the value stored in variable is implementation-defined.

For types narrower than int, things are a little more complicated. This:

variable ++;

is equivalent to this:

variable = variable + 1;

The operands of the + operator have the "usual arithmetic conversions" applied to them, which in this case means that both operands are promoted to int. Since int is more that wide enough to hold the result, there's no overflow; the result is 128, and is of type int. When that result is stored back into variable, it's converted from int to char.

The rules for overflow are different for conversions than they are for arithmetic operations like "+". For a signed-to-signed or unsigned-to-signed conversion, if the value can't be represented in the target type, the behavior is not undefined; it merely yields an implementation-defined result.

For a typical implementation that uses a 2's-complement representation for signed integer types, the value stored will probably be -128 -- but other behaviors are possible. (For example, an implementation could use saturating arithmetic.)

Another (rather obscure) possibility is that char and int could be the same size (which can happen only if char is at least 16 bits). That can have some interesting effects, but I won't go into that (yet).

查看更多
甜甜的少女心
3楼-- · 2019-02-26 14:56

An overflow occured and results in undefined behavior.

Section 5.5:

Ifduring the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined [...]

The standard goes on to note that integer overflows are, in most implementations, ignored. But this doesn't represent a guarantee.

查看更多
登录 后发表回答