Отдельный байт или тип данных int8 в переполнении стека

У меня есть следующий код:

#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 ++?

* по крайней мере для меня.

-1

Решение

uint8_t а также int8_t являются ваши настоящие 8-битные целые на C ++. Но потому что они typedefс над chars (если они вообще существуют, это не гарантировано), они интерпретируются и обрабатываются как символы стандартной библиотекой. К сожалению, вам просто нужно использовать актерский состав.

Примечание: вам не нужно использовать указатели здесь, используйте индексы массива:

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, Он реализует только побитовые операторы и функции преобразования в целочисленные типы и из них, так что это не то, что вы ищете.

0

Другие решения

ради читабельности вы можете использовать шестнадцатеричное основание и приведите к 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
0

Если вас интересует только читаемый формат вывода, и вы не хотите каждый раз набирать выражение приведения, вы можете просто добавить унарный оператор:

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, чтобы сделать это автоматически.

0
По вопросам рекламы [email protected]