gpt4 book ai didi

c - 如何在无符号操作数之间进行带符号比较?

转载 作者:行者123 更新时间:2023-12-02 07:21:06 24 4
gpt4 key购买 nike

我声明了 4 个无符号变量:

uint32_t empty_bucket;
uint32_t base_bucket;
uint32_t hop_size;
uint32_t ht_size;

我想执行签名条件检查:

if (empty_bucket < base_bucket + (hop_size - 1) - ht_size)

知道 base_bucket + (hop_size - 1) - ht_size 可能是负值。执行此烧焦操作的操作数的正确转换是什么?

注意: base_bucket + (hop_size - 1) - ht_size 可能非常接近 -2^32,因此转换为已签名32 位 int32_t 可能导致溢出。

最佳答案

由于您使用的是 stdint include,您可以将操作数转换为 64 位有符号值,并进行比较,没有任何右侧项变为负数的风险,我们必须将左操作数转换为有符号整数以避免比较有符号/无符号时的未定义/实现行为:

if ((int64_t)empty_bucket < ((int64_t)base_bucket + ((int64_t)hop_size - 1) - (int64_t)ht_size))

总结一下:

  • 没有溢出的风险(我可能在右侧投得太多了)
  • 签名实体之间的比较
  • 不利的一面是,64 位转换可能会对 32 位架构的性能产生负面影响

关于c - 如何在无符号操作数之间进行带符号比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46105567/

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