gpt4 book ai didi

c++ - 将 unsigned long long 与 signed long long 结果相减?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:57 27 4
gpt4 key购买 nike

假设我有这两种类型:

typedef unsigned long long uint64;
typedef signed long long sint64;

我有这些变量:

uint64 a = ...;
uint64 b = ...;
sint64 c;

我想从 a 中减去 b 并将结果赋给 c,很明显,如果差值的绝对值大于 2^63,那么它将换行(或未定义),这是可以的。但是对于绝对差小于 2^63 的情况,我希望结果是正确的。

以下三种方式:

c = a - b; // sign conversion warning ignored

c = sint64(a - b);

c = sint64(a) - sint64(b);

其中哪些可以保证按标准工作? (以及为什么/如何?)

最佳答案

这三个都不起作用。如果差异为负(无论绝对值如何),则第一个失败,第二个与第一个相同,如果任一操作数太大,则第三个失败。

没有分支是不可能实现的。

c = b < a? a - b : - static_cast< sint64 >( b - a );

从根本上说,unsigned 类型使用没有任何符号位的模运算。他们不知道他们环绕,并且语言规范不识别负数的环绕。此外,分配一个超出有符号整数变量范围的值会导致实现定义的、可能无意义的结果(整数溢出)。

考虑一台没有硬件的机器来在 native 负整数和二进制补码之间进行转换。不过,它可以使用按位取反和 native 二进制补码加法来执行二进制补码减法。 (也许很奇怪,但这正是 C 和 C++ 目前所要求的。)然后,该语言将负值的转换留给了程序员。这样做的唯一方法是取负一个正值,这要求计算出的差值是正的。所以……

最好的解决方案是首先避免任何将负数表示为大正数的尝试。

编辑:我之前忘记了转换,这会产生一个很大的无符号值,等同于其他解决方案!

关于c++ - 将 unsigned long long 与 signed long long 结果相减?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13814695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com