使用Casting进行无符号/有符号整数加法

问题描述 投票:0回答:1

在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));

是否保证resultOne和resultTwo总是产生相同的输出,无论我用于a和b的值是多少?

c++ casting addition
1个回答
1
投票

对于无符号类型,可以保证添加:如果将1添加到最大uint64_t,则会得到0

对于C和C ++中的签名类型,环绕是未定义的行为:任何事情都可能发生,并且在实践中,如果启用了优化,编译器可以执行您不期望的操作。

所以不,这不是标准所保证的。

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

© www.soinside.com 2019 - 2024. All rights reserved.