Для цикла от 0
до 0xffff
, оба включительно, вы делаете:
for (i=0; i <= 0xffff; ++i)
Теперь первый интересный вопрос: какой тип i
? В C гарантируется, что unsigned int
будет содержать значения в диапазоне [0, 0xffff]
, что означает, что i <= 0xffff
всегда будет истинным для unsigned int i;
, если UINT_MAX
равно 0xffff
. поэтому i
не может быть типом размера, меньшим или равным unsigned int
. long
или unsigned long
- это наименьший тип, который может хранить 0xffff + 1
в портативном режиме. Итак, нам нужно, чтобы i
был типа unsigned long
или long
. В C99 вы можете упростить задачу, включив stdint.h
, а затем используя uint32_t
type.
Второй интересный вопрос: что вы хотите написать? Будет ли макет вашего файла:
00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07
...
FF F8 FF F9 FF FA FF FB FF FC FF FD FF FE FF FF
или вы хотите записать значения в файл, используя ваш любимый тип данных выше, а затем сможете быстро их снова прочитать? Например, если int
равен 32 битам, а ваша система имеет младший порядок, запись этих значений даст вам файл, такой как:
00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 ...
Если вы хотите первое, вы должны убедиться, что вы записываете два байта на число в правильном порядке, и что порядковый номер вашей ОС не влияет на вывод. Самый простой способ сделать это, вероятно, что-то вроде этого:
for (i=0; i <= 0xff; ++i) {
unsigned char values[2];
values[0] = (i & 0xff00) >> 8;
values[1] = i & 0xff;
fwrite(values, 1, 2, fp);
}
Если вы хотите второе, ваша жизнь станет проще, особенно если вам не важен порядок байтов:
for (i=0; i <= 0xff; ++i) {
fwrite(&i, sizeof i, 1, fp);
}
запишет ваши значения, чтобы вы могли читать их обратно в той же системе с той же переменной типа.