gpt4 book ai didi

c - 无符号整数的差异 - 获得签名结果的标准支持方式?

转载 作者:太空狗 更新时间:2023-10-29 16:41:36 24 4
gpt4 key购买 nike

假设有两个任意时间戳:

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成员,然后读取union的_signed成员 结果:

u result {._unsigned = timestamp1 - timestamp2};
result._signed; // yields the result

这可以移植到任何实现我们所依赖的固定宽度类型的平台(它们不需要)。有符号成员保证 2 的补码,并且在“机器”级别,2 的补码有符号算术与无符号算术没有区别。这里没有转换或 memcpy 类型的开销:一个好的编译器会编译出本质上是标准语法糖的东西。

(请注意,这是 C++ 中的未定义行为。)

关于c - 无符号整数的差异 - 获得签名结果的标准支持方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56854354/

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