Hello, here are the full code demonstrations below:

1. For <iostream> demonstration 1
/*-------------------------------------------------*/

#include <cstdint>
#include <iostream>

int main()
{
    std::int8_t myInt{65};
    std::cout << "Takes ASCII char " << myInt << '\n';
    std::cout << "(static_cast): " << static_cast<int>(myInt) << '\n';
    std::cout << "(int): " << (int)myInt << '\n';

    return 0;
}
// First prints the ASCII character for 65, which is "A"
// (int) and static_cast print 65 correctly.
// The programmer learns to use (int) to print out int8_t

/*-------------------------------------------------*/
2. <iostream> demonstration 2
/*-------------------------------------------------*/

#include <cstdint>
#include <iostream>

int main()
{
    std::cout << "Enter a number between 0 and 127: ";
    std::int8_t myInt{};
    std::cin >> myInt;
    std::cout << "You entered (no cast): " << myInt << '\n';
    std::cout << "You entered (static_cast): " << static_cast<int>(myInt) << '\n';
    std::cout << "You entered ( (int) ): " << (int)myInt << '\n';
    return 0;
}

// *User input:* 35
// You entered: 3                         // this is the first char given onlly. The second one is ignored.
// You entered (static_cast): 51   // this is when the programmer assumes (int) or static_cast<int> should be used
// You entered ( (int )): 51           // 51 is the ASCII number for '3' .


/*-------------------------------------------------*/
3. <cstdio> demonstration 3
/*-------------------------------------------------*/

#include <iostream>
#include <cstdint>
#include <cstdio>
int main()
{
    std::int8_t num{};
    std::scanf("%hhd", &num);                      // Read the number and store it in num
    std::printf("%d this for cstdio.h\n", num); // Print the value of num
    std::cout << sizeof(num) * 8;
    return 0;
}
//*User input*: 100
// prints correctly 100
// size is still int8_t.

On Sat, Dec 23, 2023 at 7:45 AM Yongwei Wu <wuyongwei@gmail.com> wrote:
int8_t is just an alias of signed char, and char, signed char, and unsigned char are all character types (as the names imply). Your first code snippet behaves as expected, as far as the current C++ standard is concerned. I believe you were mistaken somewhere about the second code snippet, and I cannot reproduce what you described.

You might regard the problem as a design defect, but this is a fact already (partly as the price we paid for C compatibility). If one needs an 8-bit integer type that does not behave like a char, a new user-defined type is then needed, as well as some utility functions to support stream input/output. They are quite easy to write (though it is a regret that they do not exist in the standard library).

On Sat, 23 Dec 2023 at 08:35, Olavi Esker via Std-Discussion <std-discussion@lists.isocpp.org> wrote:


Hello,
With <iostream> int8_t prints out char according to ascii number. Similarly it reads a single char, which cannot be static int 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 35, it read it only first '3', and prints out 51.


The g++ 13.2 compiler gives also 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. 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.

Thanks.
OE

--
Std-Discussion mailing list
Std-Discussion@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion


--
Yongwei Wu
URL: http://wyw.dcweb.cn/