gpt4 book ai didi

c - 如何用环绕或溢出减去两个无符号整数

转载 作者:太空狗 更新时间:2023-10-29 16:28:13 25 4
gpt4 key购买 nike

有两个无符号整数(x 和 y)需要相减。 x 总是大于 y。但是,x 和 y 都可以环绕;例如,如果它们都是字节,则 0xff 之后是 0x00。问题是 x 环绕,而 y 不环绕。现在 x 似乎小于 y。幸运的是,x 不会环绕两次(保证只有一次)。假设字节,x 已经换行并且现在是 0x2,而 y 没有换行并且是 0xFE。 x - y 的正确答案应该是 0x4。

也许,

( x > y) ? (x-y) : (x+0xff-y);

但我认为还有另一种方式,涉及到 2s compliment?,并且在这个嵌入式系统中,x 和 y 是最大的 unsigned int 类型,因此添加 0xff... 是不可能的

编写语句的最佳方式是什么(目标语言是 C)?

最佳答案

假设两个无符号整数:

  • 如果您知道一个应该比另一个“大”,只需减去即可。只要你没有绕过不止一次,它就会起作用(显然,如果你绕过,你将无法分辨)。
  • 如果您不知道一个比另一个大,请将结果相减并将其转换为宽度相同的有符号整数。只要两者之间的差异在 signed int 的范围内,它就会起作用(否则,您将无法分辨)。

澄清一下:原发布者描述的场景似乎让人感到困惑,但它是典型的单调递增固定宽度计数器,例如硬件滴答计数器或协议(protocol)中的序列号。计数器变为(例如,对于 8 位)0xfc、0xfd、0xfe、0xff、0x00、0x01、0x02、0x03 等,并且您知道在您拥有的两个值 x 和 y 中,x 稍后出现。如果 x==0x02 和 y==0xfe,计算 x-y(作为 8 位结果)将给出正确答案 4,假设两个 n 位值的减法换行模 2< sup>n - C99 保证减去无符号值。 (注意:C 标准保证这种减去有符号值的行为。)

关于c - 如何用环绕或溢出减去两个无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061245/

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