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 02:35:36 +0200
>
>> 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
>>
>>

Received on 2023-12-23 00:35:38