Я думаю, что этот вопрос был неправильно понят предыдущими двумя ответчиками. Комментарии ОП указывают на то, что они переносят long
из системы LP64 в систему ILP32, предположительно оба x86.
В системе LP64 x86 тип примитива long
имеет ширину 64 бита, сначала младший байт. В системе ILP32 x86 тот же тип примитива long
имеет ширину 32 бита, сначала младший байт.
Проблемы возникнут, если вы наивно кодируете тип данных long
и будете переводить числа туда и обратно. Возможно, вы выполняете отладку на своем компьютере для разработки x86_64, и все, кажется, работает (с вами memcpy (), все), и это таинственным образом ломается в системе i386, потому что вы пытаетесь сжать 8 байт в 4-байтный long
.
Именно поэтому stdint.h
был представлен в стандартной библиотеке C99. Это позволяет вам писать более переносимый код, указав точную ширину для ваших целых чисел. Если вам нужно целое число без знака шириной 64 бита, используйте uint64_t
. Этот тип инвариантен в системах ILP32 и LP64 x86. Аналогично, если вы хотите 32-разрядное целое число со знаком, используйте int32_t
. См. эту статью в Википедии для более подробной информации по теме.