有符号整数到无符号整数并返回?

Signed integer to unsigned and back?

我想将带符号的 int32 存储到未带符号的 uint32 中,以便稍后从中提取 int32。当 uint32 存储这样的整数时,它本身的值不会被使用,但不幸的是,在这种情况下我不能使用联合。我目前这样做的方法是简单地转换它:

int32  signedVar   = -500;
uint32 unsignedVar = uint32(signedVar);
func(int32(unsignedVar)); // should supply the function with -500

这似乎可行,但我担心它可能无法移植,并且可能会在幕后发生不必要的转换,我希望这是一个空操作。

是否保证 -500 或任何其他负数在该转换后仍然存在?如果不是,有没有"painless"(none的类型变了,只有转换方法)替代?

编辑:我最关心的是确保 int32 中的值保留在 uint32 中,以便以后可以用作具有相同值的 int32uint32 版本从未使用过。 (编辑是因为 SO 要求我解释这不是另一个问题的重复;它没有指定转换的结果应该是什么样子,或者它需要像这样对称,这使得它太笼统了在这里应用)

如果您的机器使用 1s-complement 或 sign-magnitude 算法(至少 C 标准允许;C++ 不确定),那么此双重转换会将值 -0 转换为 0。如果您的机器使用2s补码,这样就可以了

也就是说,我不知道在过去 30 年中制造的任何机器都使用 2s 补码以外的任何东西来计算算术。