Я знаю, что при использовании %x
с printf()
мы печатаем из стека 4 байта (int
в шестнадцатеричном формате). Но я бы хотел напечатать только 1 байт. Есть ли способ сделать это ?Как распечатать 1 байт с помощью printf?
ответ
Вам необходимо быть осторожным, как вы это делаете, чтобы избежать любого undefined поведение.
Стандарт C позволяет бросить int
к unsigned char
распечатайте байты вы хотите с помощью арифметики указателей:
int main()
{
int foo = 2;
unsigned char* p = (unsigned char*)&foo;
printf("%x", p[0]); // outputs the first byte of `foo`
printf("%x", p[1]); // outputs the second byte of `foo`
}
Обратите внимание, что p[0]
и p[1]
преобразуются в более широком типа (int
) , перед отображением вывода.
Ницца. Предложите разделитель, чтобы не вытеснять выход вместе. Только угловая проблема связана с редким 'sizeof (int) == 1'. Возможно, используйте 'for (size_t i = 0; i
Если вы хотите напечатать один байт, который присутствует в большем типе значений, вы можете замаскировать и/или сдвинуть требуемое значение (например, int x = 0x12345678; x & 0x00FF0000 >> 16). Или просто получить требуемый байт, наведя нужное место байта, используя (без знака) указатель на символ и используя смещение.
Предполагает: вы хотите напечатать значение переменной ширины в 1 байт, то есть char
.
В случае, если у вас есть char
переменных сказать, char x = 0;
и хочет распечатать значение, используйте %hhx
спецификатор формата с printf()
.
Что-то вроде
printf("%hhx", x);
В противном случае, из-за по умолчанию продвижения аргумент, такое заявление
printf("%x", x);
также быть правильным, так как printf()
не будет читать sizeof(unsigned int)
из стека, значение из x
будет считаться на основе его типа, и в любом случае он будет повышен до требуемого.
Вы должны пометить язык. Это C? – Bathsheba
Не верно. 'printf ("% x ", x)" выводит значение 'x' в шестнадцатеричной форме. Предполагается, что размер 'x' имеет тип' (int) ', но это не обязательно 4 байта. – giusti
Я добавил тэг C. Я * думаю * мой ответ правильный, пожалуйста, вниз, если это не так. – Bathsheba