带强制转换的无符号/有符号整数加法 在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));

带强制转换的无符号/有符号整数加法 在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));,c++,casting,addition,C++,Casting,Addition,是否保证无论我对a和b使用什么值,ResultTone和resultTwo都将始终产生相同的输出?对于无符号类型,加法保证是完整的:如果您将1添加到最大值uint64\t,您将得到0 使用符号类型,C和C++都是未定义的行为:任何事情都可能发生,实际上,编译器可以在优化打开时做你不期望的事情。 所以不,这不是标准的保证 但是,作为标准的扩展,许多编译器提供了一个选项,可以保证签名类型的包装行为,在这种情况下,答案是肯定的。例如,请参阅GCC和Clang的说明。如果您想要保证,请不要触摸签名类型。

是否保证无论我对a和b使用什么值,ResultTone和resultTwo都将始终产生相同的输出?

对于无符号类型,加法保证是完整的:如果您将
1
添加到最大值
uint64\t
,您将得到
0

使用符号类型,C和C++都是未定义的行为:任何事情都可能发生,实际上,编译器可以在优化打开时做你不期望的事情。 所以不,这不是标准的保证


但是,作为标准的扩展,许多编译器提供了一个选项,可以保证签名类型的包装行为,在这种情况下,答案是肯定的。例如,请参阅GCC和Clang的说明。

如果您想要保证,请不要触摸签名类型。@AnttiHaapala已编辑。你能解释一下为什么答案是否定的吗?看。在使用-fwrapv的情况下,可以保证平等吗?@LevKnoblock是的,但我在回答中跳过了一些细节。如果无符号值不在有符号类型的范围内,则强制转换本身为;在那之后,它将是你期望的价值。事实证明,这种行为的定义与C++20的定义相同。