2017-01-13 16 views
1

Я знаю, что при использовании %x с printf() мы печатаем из стека 4 байта (int в шестнадцатеричном формате). Но я бы хотел напечатать только 1 байт. Есть ли способ сделать это ?Как распечатать 1 байт с помощью printf?

+1

Вы должны пометить язык. Это C? – Bathsheba

+0

Не верно. 'printf ("% x ", x)" выводит значение 'x' в шестнадцатеричной форме. Предполагается, что размер 'x' имеет тип' (int) ', но это не обязательно 4 байта. – giusti

+0

Я добавил тэг C. Я * думаю * мой ответ правильный, пожалуйста, вниз, если это не так. – Bathsheba

ответ

3

Вам необходимо быть осторожным, как вы это делаете, чтобы избежать любого 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) , перед отображением вывода.

+0

Ницца. Предложите разделитель, чтобы не вытеснять выход вместе. Только угловая проблема связана с редким 'sizeof (int) == 1'. Возможно, используйте 'for (size_t i = 0; i chux

0

Если вы хотите напечатать один байт, который присутствует в большем типе значений, вы можете замаскировать и/или сдвинуть требуемое значение (например, int x = 0x12345678; x & 0x00FF0000 >> 16). Или просто получить требуемый байт, наведя нужное место байта, используя (без знака) указатель на символ и используя смещение.

6

Предполагает: вы хотите напечатать значение переменной ширины в 1 байт, то есть char.

В случае, если у вас есть char переменных сказать, char x = 0; и хочет распечатать значение, используйте %hhx спецификатор формата с printf().

Что-то вроде

printf("%hhx", x); 

В противном случае, из-за по умолчанию продвижения аргумент, такое заявление

printf("%x", x); 

также быть правильным, так как printf() не будет читать sizeof(unsigned int) из стека, значение из x будет считаться на основе его типа, и в любом случае он будет повышен до требуемого.