【发布时间】:2011-03-02 02:45:24
【问题描述】:
以下是在 C++ 中将 unsigned int 转换为 int 的有效且无问题的方法吗:
#include <limits.h>
void safeConvert(unsigned int passed)
{
int variable = static_cast<int>(passed % (INT_MAX+1));
...
}
或者有更好的方法吗?
更新
正如 James McNellis 所指出的,将 unsigned int > INT_MAX 分配给整数并不是未定义的——而是由实现定义的。因此,这里的上下文现在特别是我的偏好是确保当 unsigned int 超过 INT_MAX 时此整数重置为零。
原始上下文
我有许多 unsigned int 用作计数器,但希望在特定情况下将它们作为整数传递。
在正常操作下,这些计数将保持在 INT_MAX 的范围内。但是,为了避免在发生异常(但有效)情况时遇到 undefined 实现特定的行为,我希望在这里进行一些有效的转换。
【问题讨论】:
-
应该是
safeConvert?那么,当输入大于 INT_MAX 时,您希望发生什么?在这种情况下你想设置一些标志吗? -
虽然有符号运算期间的溢出会产生未定义的行为,但转换为有符号整数类型不会:如果值不能由目标类型表示,则结果是实现定义的。
-
@Hamish 感谢您的拼写错误。当输入大于 INT_MAX 时,最好确保 int 值 > 0。
-
@James 好点,所以从技术上讲,这项任务在没有任何卫生条件的情况下是有效的。所以这里的问题更多是关于我对发生溢出时的值的偏好?
-
我会使用 if,但我猜这只是我自己
标签: c++ visual-c++ overflow integer-overflow