<分区>
我在一些代码中看到我们有一个带符号的值被传递给函数(它采用无符号值)。返回的值再次转换回带符号的值(目的是获得原始带符号的值)。即使它当前有效。我怀疑,在这种情况下,在所有可能的情况下,原始带符号的值是否会保留?
有人告诉我转换不好,应该尽可能避免。一些计算机科学专家可以让我知道什么时候可以破解这段代码吗?
<分区>
我在一些代码中看到我们有一个带符号的值被传递给函数(它采用无符号值)。返回的值再次转换回带符号的值(目的是获得原始带符号的值)。即使它当前有效。我怀疑,在这种情况下,在所有可能的情况下,原始带符号的值是否会保留?
有人告诉我转换不好,应该尽可能避免。一些计算机科学专家可以让我知道什么时候可以破解这段代码吗?
最佳答案
我知道的所有实现(在不同平台上使用 C++ 20 多年之后),通过什么都不做来转换有符号 <-> 无符号整数,即二进制值不变地传递。
这种行为的根源在于处理(即不处理)C 中的整数溢出。有这样的遗留问题,这种有符号/无符号转换是一件合理的事情。我认为这永远不会改变。
总而言之,有符号 -> 无符号 -> 有符号和无符号 -> 有符号 -> 无符号的转换是 100% 安全的。当您有偶数次转换时,您要么需要注意数字的值是一个不使用最高位的非负整数,在这种情况下,类型是有符号还是无符号并不重要。否则,您应该使用自己的代码明确处理超出范围的值。
关于c++ - 转换回早期类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772644/