Сравните uint8_t и uint16_t в переполнении стека

я хотел бы проверить, если значение входной переменной прошло один байт или знаю, поэтому я пишу этот код

{
uint8_t x;
cout << " enter x" << endl;
cin  >> hex >> x;
cout << hex << x;
uint8_t y ;
y = x >> 4 ;
cout << hex << y;
if ( y == 0 )
{
cout << " succes, coorect value for x";
}
if (y >  0)
{
/*here i supoosed that x = 0xfff and when shifting, y would be 0xff but y is uint8 so it's just for compare
std::cout << "fail, ";
}
return 0;
}

Я хотел бы знать, как проверить, если пользователь вводит два или более байта в uint8.
И скажите ему, чтобы он набрал значение только одного байта. Вот почему я попытался сравнить uint8_t с uint16_t.

0

Решение

Проблема с приведенным выше кодом заключается в том, что вы тестируете negative значение в unsigned integer, if(y < 0) часть всегда будет ложной.

Теперь, насколько я понимаю, вы хотите отфильтровать значения, которые больше, чем 1Byte, Вы знаете, что для данного byte у тебя есть 2^8 - 1 диапазон значений, то есть число без знака лежит в диапазоне [0-255], Таким образом, ваша проблема сводится к простой проверке, то есть if the input value is greater than 255, throw away that input, (Ofc вы должны проверить < 0 ценности)

Есть и другие решения, но без контекста я не могу дать точного ответа. Надеюсь, что приведенное выше упрощение поможет.

0

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

Чтобы проверить, находится ли значение в диапазоне малого типа, вы должны сначала присвоить его большему типу. Вы просто не можете выполнить проверку самого маленького типа, потому что он никогда не может содержать слишком большое значение, которое вы хотите проверить.

uint16_t tempX;
uint8_t x;
cin >> hex >> tempX;
if (tempX > 0xff)
cout << "error";
else
x = (uint8_t)tempX;
0

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