在C ++中,是否可以保证如果我使用固定宽度整数的有符号和无符号版本执行操作,我将得到相同的结果吗? 也就是说,如果我这样做:
uint64_t a = [any number];
uint64_t b = [any number];
uint64_t resultOne = a + b;
uint64_t resultTwo = (uint64_t)(((int64_t) a) + ((int64_t) b));
无论我为a和b使用什么值,是否都可以确保resultOne和resultTwo始终产生相同的输出?
答案 0 :(得分:1)
对于无符号类型,保证可以加法:如果将1
添加到最大值uint64_t
,则会得到0
。
在C和C ++中,对于带符号类型,环绕都是不确定的行为:任何事情都可能发生,并且在实践中,如果打开了优化功能,编译器可以执行您不希望的操作。
所以不,这不是标准所保证的。
但是,作为标准的扩展,许多编译器提供了一个选项来保证带符号类型的包装行为,在这种情况下,答案是肯定的。例如,请参见GCC和Clang的-fwrapv
。