No, this is not a bug. You are using a compile time constant expression which is signed int
unless told otherwise. Therefore you can only represent numbers between -32768 and 32767. Your computation of 255 * 255 = 65025
exceeds the range. Thus you see a wrap around. In the C/C++ standard the overflow of signed types is actually undefined behavior. That means that the compiler is allowed to do anything from showing the correct answer to halt and catch fire. Only unsigned types with a known size like uint16_t
have a well-deined overflow behaviour. You should promote your right hand side computation to unsigned type like this:
z = 255U * 255U;
This way you tell the compiler your intention and don't land in "Undefined-Behaviour-Land".