Zdradliwy typ uint8_t w C++?

0
#include <iostream>
#include <cstdint>

using namespace std;

typedef unsigned short us; 

void fun (uint8_t a, uint32_t b, bool c, us d)
{
  std::cout << a<< std::endl;
  std::cout << b << std::endl;
  std::cout << c << std::endl;
  std::cout << d << std::endl;

}

int main()
{
  fun(26, 10000, false, 15);

  return 0;
}

Output:

10000
0
15

Oczekiwany output:
26
10000
0
15

Z jezyka C wiem ze typ uint8_t pozwala na przechowywanie wartosci z zakresu 0-255. Dlaczego w C++ jest to inaczej? Jak widac typ zdefiniowany przeze mnie dziala. Kompilator to g++.

0

Zobacz ile bajtów zajmuje Twój typ.
Definicja uint8_t to:
typedef unsigned char uint8_t;

0
Delor napisał(a):

Zobacz ile bajtów zajmuje Twój typ.
Definicja uint8_t to:
typedef unsigned char uint8_t;

Tak pomylka z mojej strony, typ us to dwa bajty. Dlaczego parametr a nie jest poprawnie przekazywany i nastepnie drukowany? 26 miesci sie w zakresie 0-255.

0
Delor napisał(a):

Definicja uint8_t to:
typedef unsigned char uint8_t;

Ciepło, ciepło ... w C++ jest drukowany ostatecznie jako char, a znak o kodzie 26 to jest znak niewidzialny. Gdyby JEDNAK chcieć drukować jako liczby, tzreba rzutować.
Generalnie te typedefy integerów są bardziej w duchu C niż C++ (moja ocena).
Jeszcze gorszy ból może być z boolem, wiele bibliotek chce być bardziej papieskich od papieża, i definiuje po swojemu

1
cpp_beginer napisał(a):
Delor napisał(a):

Zobacz ile bajtów zajmuje Twój typ.
Definicja uint8_t to:
typedef unsigned char uint8_t;

Tak pomylka z mojej strony, typ us to dwa bajty. Dlaczego parametr a nie jest poprawnie przekazywany i nastepnie drukowany? 26 miesci sie w zakresie 0-255.

bo 26 to kod znaku char, uint8-t to char, wpisz sobie tam np 36 to będziesz miał znak dolara
chcesz wyświetlić jako liczbę
użyj printf z formatowaniem %d

1

Problem wynika z tego jak jest przeciążony operator<<.
Dla typów char i unsigned char wypisuje znak ASCII, a nie wartość, a właśnie tym jest uint8_t. ASCII pod numenem 26 ma znak niedrukowany SUB (substitute), dlatego nic tam nie widać.
Trzeba zrobić konwersję do int i pop problemie.
https://wandbox.org/permlink/VxDBzlC23zt9xj2f

0

btw. cout ma przeciążony operator<<, który printuje poprawnie: https://ideone.com/KVRb81

2
rafal__ napisał(a):

btw. cout ma przeciążony operator<<, który printuje poprawnie: https://ideone.com/KVRb81

Tak po prawdzie, to jest dokładnie na odwrót: https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt
Wywołanie: std::cout.operator<<(a) powoduję domyślną konwersję do unsigned int i użycie:

 std::basic_ostream<CharT,Traits>& std::basic_ostream<CharT,Traits>::operator<<( unsigned int value ); // (2)

bo nie ma operatora zdefiniowanego jako członka klasy:

 std::basic_ostream<CharT,Traits>& std::basic_ostream<CharT,Traits>::operator<<( unsigned char value ); // nie ma!

za to jest taki operator jako globalna funkcja (szablon) https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2 :

template< class CharT, class Traits>
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
                                         CharT ch );

1 użytkowników online, w tym zalogowanych: 0, gości: 1