代码之家  ›  专栏  ›  技术社区  ›  Lev Knoblock

带强制转换的无符号/有符号整数加法

  •  0
  • Lev Knoblock  · 技术社区  · 5 年前

    在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使用什么值?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Daniel H    5 年前

    对于无符号类型,加法保证是环绕的:如果您添加 1 最大限度地 uint64_t 0 .

    使用签名类型,在C和C++中,包括是未定义的行为:任何事情都可能发生,并且实际上,编译器可以在优化打开时完成您不期望的事情。

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

    -fwrapv 海合会和叮当声。