А выводиться 2 Код (Text): #include <stdio.h> void main() { FILE *in; char buf[20]; in=fopen("c:\\1.bin","rb"); fread(buf,1,1,in); printf("%x",buf[0]); } Вывод -ffff Почему два байта, ведья читаю один и char это один байт.
buf[0] имеет тип char, при вызове printf преобразуется в int знаковым расширением. Например, 0xFF -> 0xFFFF [судя по выводу, система 16-битная - под 32-битной было бы 0xFFFFFFFF]. А потом printf, которая не в курсе, что исходный параметр был char, видит спецификацию %x и думает, что ей передали int, который нужно вывести целиком в hex-виде. К примеру, если бы первый байт был 0xE8, то вывелось бы ffe8, а если 0x4D, то просто 4d. Пиши "unsigned char buf[20]" либо явно преобразуй к unsigned char типа "printf(...,(unsigned char)buf[0]);".
diamond, ты описал следствие. Причина в том что обычно "char" есть signed. Fix: Код (Text): unsigned char buff[32];
Нет, у меня XP pro обычный и проц 64-битный. Почему так тогда? Не понял, а какая здесь разница? Почему в одном случае с ff, в другом без.
Угу. Имелась в виду не ось, под которой всё это происходит, а ось, под которую исходник компилируется. Под DOSовскими компиляторами в DOS-подсистеме всё происходящее 16-битное. (Если компилятор не DOSовский, а, к примеру, под Win3.x, сути дела это не меняет.) Кстати, при работе под обычной (не 64-битной) XP абсолютно безразлично, поддерживает проц 64-битный режим или нет. Вот есть переменная типа char. Который знаковый. То есть записанное там значение по определённым правилам соответствует какому-то числу из отрезка [-128,127]. При преобразовании такого значения в тип int компилятор делает так, чтобы преобразованное значение было тем же самым числом из отрезка [-128,127]. Если старший бит байта установлен, то такой байт соответствует отрицательному числу, и при записи этого же числа в двух байтах согласно тем же правилам старший байт будет равен 0xFF. В противном случае получится 0. А ведущие нули printf("%x",...) не печатает.