- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有这两种类型:
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/
这个问题已经有答案了: Diff of two Dataframes (8 个回答) 已关闭 4 年前。 我有 2 个数据框(df_a 和 df_b),有 2 列:“动物”和“名称”。 在更大的数据框
如果我得到以下数字字符串,是否可以使用 LINQ 查询将这些数字一起加/减? string numbers = "1 + 1, 2 - 1, 3 + 3"; 所以我最终会得到这样的东西: 字符串数字
具有以下对象列表: public class Example { public string Local { get; set; } public string Type { get;
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
#include #include float sum (float *A, int len) // sum of table of floats { float ss = 0.0;
我正在阅读这篇博文:https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/ 我很困惑: size_t len = end
我正在阅读这篇博文:https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/ 我很困惑: size_t len = end
这个问题已经有答案了: Pointer Arithmetic In C (2 个回答) Pointer subtraction confusion (8 个回答) 已关闭 4 年前。 int vect
我知道这可能是个愚蠢的问题,但我遇到了一些麻烦,我很惭愧,但我真的不知道如何做到。我想加减两个以整数形式给出的“小时”。 #include #include #include using nam
大家好 StackOverflow.. 这个网站相当新,但我得到了很好的反馈!所以首先要感谢大家! 我想做的是类似于wonga的事情 https://www.wonga.com/ 但是随着值的协同工作
我是一名优秀的程序员,十分优秀!