On Sat, 23 Dec 2023, 00:15 Olavi Esker via Gcc-help, wrote: > Hello, > With int8_t prints out char according to ascii number. Similarly > it reads a single char, which cannot be static converted. The compiler > gives no warning whatsoever. But when is used with scanf %hhd and > printf %d it works perfectly. Is this really the intended > functioning? In Rust i8 and C int8 works fine, too. > #include > #include > > int main() > { > std::int8_t myInt{65}; > myInt += 1; > std::cout << myInt; > } > > Guess what this returns? > Character "B". > > int main() > { > std::int8_t myInt{}; > std::cin >> myInt; > std::cout << myInt; > } > This will also read a character, and > print the characters ascii value. > So if I give it 3, it read it as '3', and prints out 51. > > > The compiler gives no warning of this whatsoever with the flags: > "-std=c++20", > "-pedantic-errors", > "-Wall", > "-Wpedantic", > "-Wshadow", > "-Wcast-align", > "-Wlogical-op", > "-Wno-unused-parameter", > "-Weffc++", > "-Wextra", > "-Wconversion", > "-Wsign-conversion". > > > It does seem like a mistake to have `signed char` and `unsigned char` > display as characters rather than numbers, since `char` is a distinct type. > No, it's not a mistake. There are intentionally designed functions for writing both signed char and unsigned char to an ostream. This is the intended behaviour. Changing it now would break code that expects the behaviour that has existed for more than 20 years. And so `char` could display as a character and the other two as integers. > > Wish you can change this, or at least have a warning, because > functions fine for higher bitted integers. > A warning doesn't seem appropriate for code that works perfectly correctly according to the standard. What if this is exactly the behaviour you want? Why should it warn? This is something that surprises beginners, then they learn how it works, and it's not a problem. Just cast to int to get what you want.