假设两个任意时间戳:
uint32_t timestamp1;
uint32_t timestamp2;
除了转换为更大的有符号类型和相当冗长的 if-else 的明显变体之外,是否有标准的一致方法来获得两者的有符号差异。
事先不知道哪一个更大,但已知差异不大于最大 20 位,因此它将适合 32 位有符号。
int32_t difference = (int32_t)( (int64_t)timestamp1 - (int64_t)timestamp2 );
这种变体的缺点是硬件可能不支持使用 64 位算术,当然只有存在更大的类型时才可能(如果时间戳已经是 64 位怎么办)。
另一个版本
int32_t difference;
if (timestamp1 > timestamp2) {
difference = (int32_t)(timestamp1 - timestamp2);
} else {
difference = - ((int32_t)(timestamp2 - timestamp1));
}
非常冗长并且涉及条件跳转。
那是与
int32_t difference = (int32_t)(timestamp1 - timestamp2);
从标准的角度来看,这是否保证有效?
您可以使用union
类型双关语基于
typedef union
{
int32_t _signed;
uint32_t _unsigned;
} u;
执行计算unsigned
算术运算,将结果赋给_unsigned
会员,然后阅读_signed
的成员union
作为结果:
u result {._unsigned = timestamp1 - timestamp2};
result._signed; // yields the result
这可以移植到任何实现我们所依赖的固定宽度类型的平台(他们不需要)。 2 的补码对于有符号成员是有保证的,并且在“机器”级别,2 的补码有符号算术与无符号算术没有区别。没有转换或memcpy
-type 开销:一个好的编译器会编译出本质上标准的语法糖。
(请注意,这是 C++ 中未定义的行为。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)