Re: int8_t outputs char via <iostream>

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, 23 Dec 2023, 00:15 Olavi Esker via Gcc-help, <gcc-help@xxxxxxxxxxx>
wrote:

> Hello,
> With <iostream> 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 <cstdio> is used with scanf %hhd and
> printf %d it works perfectly. Is this really the intended <iostream>
> functioning? In Rust i8 and C <stdio.h> int8 works fine, too.
> #include <iostream>
> #include <cstdint>
>
> 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 <iostream>
> 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.



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux