У меня есть следующий код:
#include <iostream>
using namespace std;
typedef uint8_t byte;
int main()
{
byte x[5] = {0,1,2,3,4};
byte* xptr = x;
for (int i = 0; i < 5; ++i)
{
cout << "\n x[" << i
<< "] = " << *xptr
<< " at " << xptr;
xptr = xptr + 1;
}
xptr = xptr - 5;
cout << "\n\n\n";
}
вывод содержит странные символы следующим образом:
Я ожидаю, что это потому, что основной тип uint8_t
связано с char
тип данных.
Я знаю, что могу сделать некоторые явные преобразования типов, чтобы заставить его работать следующим образом:
cout << "\n x[" << i
<< "] = " << (int)*xptr
<< " at " << (void*)xptr;
Кроме того, я знаю, что могу сделать урок, чтобы справиться с этим самостоятельно.
Однако я предпочитаю не использовать преобразование типов или создавать специальный класс, если это возможно.
Я прошел через Интернет, и я получил этот на StackOverflow, но это не помогло.
Итак, есть ли родной способ иметь 8-битный целочисленный тип на C ++, который действует так же, как int
а также short
со всеми стандартными библиотеками? или это всего лишь одно из бесчисленных недостатков C ++?
* по крайней мере для меня.
uint8_t
а также int8_t
являются ваши настоящие 8-битные целые на C ++. Но потому что они typedef
с над char
s (если они вообще существуют, это не гарантировано), они интерпретируются и обрабатываются как символы стандартной библиотекой. К сожалению, вам просто нужно использовать актерский состав.
Примечание: вам не нужно использовать указатели здесь, используйте индексы массива:
for (int i = 0; i < 5; ++i)
{
cout << "\n x[" << i
<< "] = " << (int)x[i]
<< " at " << hex << &x[i] << dec;
}
Примечание 2: C ++ 17 представит std::byte
типа, но это просто странная обертка вокруг unsigned char
с помощью enum class
, Он реализует только побитовые операторы и функции преобразования в целочисленные типы и из них, так что это не то, что вы ищете.
ради читабельности вы можете использовать шестнадцатеричное основание и приведите к int:
for (int i = 0; i < 5; ++i)
{
cout << "\n x[" << i << "] = " << (int)*xptr << " at " << hex << (int)xptr;
xptr++;
}
выход:
x[0] = 0 at 8ffeb0
x[1] = 1 at 8ffeb1
x[2] = 2 at 8ffeb2
x[3] = 3 at 8ffeb3
x[4] = 4 at 8ffeb4
Если вас интересует только читаемый формат вывода, и вы не хотите каждый раз набирать выражение приведения, вы можете просто добавить унарный оператор:
cout << +x;
Это выполняет неявное преобразование в int
,
Пример:
#include <iostream>
int main()
{
char ch = 'D';
std::cout << ch << "\n"; // Displays "D"std::cout << +ch << "\n"; // Displays "68"}
К сожалению, нет опции ostream, такой как манипулятор ввода-вывода std :: dec, чтобы сделать это автоматически.