什么是避免在C++中将unsigned int转换为int的整数溢出的有效方法?

Gle*_*n T 3 c++ overflow integer-overflow visual-c++

以下是在C++中将unsigned int转换为int的有效且无问题的方法:

#include <limits.h>
void safeConvert(unsigned int passed) 
{
    int variable = static_cast<int>(passed % (INT_MAX+1)); 
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?

UPDATE

正如James McNellis指出的那样,将unsigned int> INT_MAX分配给一个整数并不是未定义的 - 而是实现定义的.因此,此处的上下文现在特别针对我的偏好,即当unsigned int超过INT_MAX时,确保此整数重置为零.

原始背景

我有一些unsigned int用作计数器,但是想要在特定情况下将它们作为整数传递.

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

Ben*_*igt 7

这应该也有效:

int variable = passed & INT_MAX;
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案虽然简洁,但却利用了 INT_MAX 的实现相关属性(通常定义为 2**n - 1)。OP 的具体目标是避免实现定义的行为。最好使用 *typedef char Test[((INT_MAX + 1u) &amp; ((INT_MAX + 1u) - 1)) == 0];* 首先 ;) 之类的方法检查此属性 (2认同)