From this reference:
If extraction fails (e.g. if a letter was entered where a digit is expected), value is left unmodified and failbit is set (until C++11)
If extraction fails, zero is written to value and failbit is set. If extraction results in the value too large or too small to fit in value, std::numeric_limits::max() or std::numeric_limits::min() is written and failbit flag is set. (since C++11)
It seems that your compiler is compiling in C++11 mode, which changes the behavior.
The input operator uses the locale facet std::num_get
whose get
function invokes do_get
. For C++11 it’s specified to use std::strtoll
et. al. type of functions. Before C++11 it apparently used std::scanf
style parsing (going by the reference, I don’t have access to the C++03 specification) to extract the numbers. The change in behavior is due to this change in parsing the input.