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

时间:2016-05-18 15:43:29

标签: c++ casting type-punning

我希望将已签名的int32存储到未签名的uint32中,以便稍后我可以从中提取int32。在存储这样的整数时,不使用uint32本身的值,但遗憾的是,在这种情况下我不能使用union。我目前这样做的方法是简单地转换它:

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

这似乎有效,但我担心它可能不便携,并且可能会在幕后发生不必要的转换,因为我希望这是无操作。

是否保证-500或任何其他负数保持这种转换?如果没有,是否有“无痛”(没有类型被改变,只有转换方法)替代?

编辑:我最关心的是确保int32中的值保留在uint32中,以便以后可以将int32用作相同值的uint32 {永远不会使用{1}}版本。 (编辑,因为SO要求我解释这不是另一个问题的重复;它没有说明转换的结果应该是什么样的,或者它需要像这样对称,使它太笼统在这里申请)

1 个答案:

答案 0 :(得分:2)

如果您的机器使用1s补码或符号幅度算术(至少C标准允许;不确定C ++),则此双转换会将值-0转换为0.如果您的机器使用2s补充,那么这将没事。

那就是说,我不知道过去30年里建造的任何机器都使用2s以外的任何机器来补充算术。