Sorry for the first answer, here is an explanation from the C++ standards :)
Is the output in any way predictable
or its undefined??
It is predictable. There are two points to look after in this code:
First, the assignment of value that the type unsigned char
can't hold:
unsigned char c;
c = 300;
3.9.1 Fundamental types (Page 54)
Unsigned integers, declared unsigned,
shall obey the laws of arithmetic
modulo 2n where n is the number of
bits in the value representation of
that particular size of integer.41)
...
41) This implies that unsigned
arithmetic does not overflow because a
result that cannot be represented by
the resulting unsigned integer type is
reduced modulo the number that is one
greater than the largest value that
can be represented by the resulting
unsigned integer type.
Basically:
c = 300 % (std::numeric_limits<unsigned char>::max() + 1);
Second, passing %d
in the format string of printf
to print unsigned char
variable.
This one ysth got it right ;) There is no undefined behavior, because a promotional conversion from unsigned char to int happens in the case of variadic arguments
!
Note: that the second part of the answer is a rephrasing of what have been said in the comments of this answer but it is not my answer originally.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…