C++ Logo

std-discussion

Advanced search

Re: int8_t outputs char via <iostream>

From: Olavi Esker <olavi.esker_at_[hidden]>
Date: Sat, 23 Dec 2023 09:15:17 +0200
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_at_[hidden]> 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_at_[hidden]> 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_at_[hidden]
>> https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion
>>
>
>
> --
> Yongwei Wu
> URL: http://wyw.dcweb.cn/
>

Received on 2023-12-23 07:15:30