4

以下是在 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 的范围内。但是,如果发生异常(但有效)情况,为了避免遇到未定义的实现特定行为,我希望在这里进行一些有效的转换。

4

2 回答 2

7

这也应该有效:

int variable = passed & INT_MAX;
于 2011-03-02T02:49:20.473 回答
0

在正常操作下,这些计数将保持在 INT_MAX 的范围内。但是,如果发生异常(但有效)的情况,为了避免遇到未定义的行为,我希望在这里进行一些有效的转换。

高效转换成什么?如果 int 和 unsigned int 的所有共享值都对应,并且您希望其他无符号值(例如 INT_MAX + 1)各自具有不同的值,则只能将它们映射到负整数值。这是默认完成的,可以使用static_cast<int>(my_unsigned). 否则,您可以将它们全部映射为 0、-1 或 INT_MIN,或丢弃高位...最简单的方法是:if (my_unsigned > INT_MAX) my_unsigned = XXX,或...my_unsigned &= INT_MAX清除高位。但是如果int溢出,被调用的函数会正常工作吗?也许更好的解决方案是使用 64 位整数开始?

于 2011-03-02T03:07:04.267 回答