[Предыдущий комментарий повышен до ответа]
Звучит так, как будто важна битовая комбинация, а не целочисленное значение как таковое. Вы можете сохранить это как подписанное - просто приведите его как C подписанное <-> приведение без знака не обеспечивает математическую корректность и просто сохраняет биты. Примените его обратно, чтобы использовать.
Контрольный вопрос:
В общем, да, в (Obj-) C (++) вы можете хранить целочисленное значение без знака в переменной с эквивалентным целочисленным типом со знаком и наоборот. Преобразование C в значение sign -> unsigned по определению приравнивается к битовой копии при использовании целых чисел дополнения 2, и оба типа имеют одинаковый размер. Иначе говоря, unsigned -> signature - это «определение реализации», которое на практике обычно означает битовую копию. Clang и GCC используют битовую копию для обоих, но если вы хотите быть абсолютно уверены, вы можете использовать union
:
unsigned long r;
long l;
r = (unsigned long)l; // will always work (cast optional)
// following is l = (long)r (cast optional) without "implementation defined" risk
{ union { long sValue; unsigned long uValue; } tmp; tmp.uValue = r; l = tmp.sValue;}
А если серьезно, я сомневаюсь, что кто-нибудь будет! (Примечание: Clang по крайней мере скомпилирует его в прямое назначение (бит-копия).)