【问题标题】:What does this do? if(unsigned(x-dx)<unsigned(size))这是做什么的?如果(无符号(x-dx)<无符号(大小))
【发布时间】:2014-08-22 20:53:32
【问题描述】:

我在一段我试图理解的代码中发现了这一点。这可能是一些聪明的把戏,但我不明白。什么时候

    unsigned(x-dx)<unsigned(size)

真的吗? xdxsize 都是 (signed) int。从上下文我猜,x-dx 不应该小于零并且不大于大小。但我不明白 unsigned 把戏。

谁能解释一下或告诉我在哪里可以找到有关它的更多信息?

提前谢谢

【问题讨论】:

  • 你能提供更多的上下文,否则答案只是猜测看起来像是在滚动的。
  • 使用语言标签时要小心/具体。
  • 诀窍是当转换为unsigned时,负数会变成一个非常大的正数。

标签: c++ comparison unsigned


【解决方案1】:

此代码确定x - dx 是否在[0 ... size) 范围内:如果x - dx 为负数,则在转换为unsigned 时会变成一个很大的正值。 Large 在此上下文中表示大于 [signed] int 类型的任何正值的值。也就是比较

unsigned(x - dx) < unsigned(size)

如果x - dx 为非负数且小于size,则为真。

【讨论】:

  • @AlexD 有点正确。负符号数的范围是无符号数范围的一半。所有负数都将映射到无符号数范围的上半部分,因此它们都大于正数。
  • @AlexD:确切的公式并不好玩,因为它需要特殊处理一些值,并且不能真正保证底层机器使用二进制补码。我更改了解释以澄清我对 large 的含义(大于int 类型的任何正值)。
  • @ShafikYaghmour:我当然没有猜到这种行为!但是,我目前无法轻松访问 C++ 标准来验证哪个部分描述了我所描述的行为。
  • @AndreyT:unsigned(x - dx) 小于或等于std::numeric_limits&lt;int&gt;::max() 的情况只有在x - dx 小于std::numeric_limits&lt;int&gt;::min() 时才会发生,并且这种情况显然不会发生[在正确的程序中]因为这将是未定义的行为(有符号整数溢出)。
  • @ShafikYaghmour:我很确定代码的意图就是我所说的,即使没有看到任何上下文!这是一种标准的成语。 ...关于工作文件:作为 C++ 委员会的成员,我很清楚在哪里可以找到它们,并且我也可以访问实际标准。只是现在不在我正在使用的移动设备上。
【解决方案2】:

unsigned(anything)本质上是一个铸造操作,就像(unsigned) anything一样。它导致其参数被视为无符号数,这意味着它只能表示大于或等于零的值。

如果 x 小于 dx,此代码将表现异常。表达式unsigned(x - dx) 将变为一个很大的正数,而不是一个负数。

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2010-11-23
    • 1970-01-01
    • 2021-02-13
    • 2012-01-24
    • 2012-04-27
    相关资源
    最近更新 更多