printf байт в шестнадцатеричную строку странный вывод - PullRequest
2 голосов
/ 21 июня 2011

Следующий простой код выдает странный вывод:

#include <stdio.h>
#include <string.h>
#include "/tmp/sha.h"
#define DIGEST 64

//taken from coreutils 8.5 - produces 64-byte sha digest and puts it into resblock
extern int sha512_stream(FILE *stream, void *resblock);

int main(int argc, char** argv) {

char sha[DIGEST];
memset(sha, 0, DIGEST);
FILE *stream;
stream = fopen("/bin/less", "r");
sha512_stream(stream, (void *) sha);
fclose(stream);

char buf[2] = {10, 32};
printf("%02x\n", sha[0]);
printf("%02x\n", buf[0]);

return 0;}

Дает вывод:
ffffffa9
0a

Первый байт ша - это A9, но откуда берется отступ F?

В Ubuntu Linux 10.10 с gcc 4.4.5.

1 Ответ

7 голосов
/ 21 июня 2011

(char) по умолчанию (signed char) в Linux x86, и поскольку printf() использует stdarg, (signed char) неявно повышается до (int), что приводит к расширению знака. Вам нужно объявить его (unsigned char), чтобы получить ожидаемое поведение. (Невозможно передать информацию о типе через stdarg, поэтому продвижение по умолчанию выполняется для аргументов.)

...