【问题标题】:= (~0); What does it mean? [duplicate]= (~0);这是什么意思? [复制]
【发布时间】:2011-08-23 01:37:27
【问题描述】:

可能的重复:
Is it safe to use -1 to set all bits to true?
int max = ~0; What does it mean?

你好,

我偶然发现了这段代码..

size_t temp;
temp = (~0);

有人知道它的作用吗?

【问题讨论】:

  • @Bart:真是一个了不起的网站!
  • 这是获取最大值的错误方法。相反,您应该为它分配值-1,这可以保证正常运行。请参阅讨论here。 (考虑到链接问题中的信息量,实际上是重复的。)
  • @GManNickG 但是 size_t 是无符号的。
  • @Vincent:你读过我提供的链接吗?

标签: c


【解决方案1】:

~ 是按位非运算符,它反转操作数的每一位。在这种情况下,操作数是 0,所以每个位最初都是 0,并且在按位应用后,并不是每个位都会为 1。最终结果是你得到一个 size_t 填充 1 位。

【讨论】:

  • 结果是将填充为 1 位的int 转换为size_t。使用二进制补码,这是一个用 1 位填充的 size_t
  • @SteveJessop size_t 是无符号类型
  • @Vincent:但int 已签名,这就是表示会影响int -> size_t 转换的原因。如果int 是一个的补码,那么结果就是0,如果int 是符号量级那么结果就是(size_t)(INT_MAX) + 2
【解决方案2】:

sharptooth 的回答是正确的,但为了给你更多细节,~NOT 的二元运算符。基本上,您将 NOT 0 的二进制等效项分配给 temp,这会将每个位设置为 1。

【讨论】:

    【解决方案3】:

    这是一种通常用于分配 size_t 值的方法,该值由所有二进制值组成,与 size_t 类型的实际大小无关。如果那是该代码的目的,则应该改用(size_t)( -1 )

    顺便说一句here's an identical question

    【讨论】:

    • 我认为 C 中没有static_cast。他确实说过 C。
    • 我不会 -1 因为这是一个常见的误解,但这是不正确的。事实上,它们是不同的。将-1 分配给无符号类型可以保证产生该类型可以容纳的最大值。相反,分配~0 可能会在一个人的恭维机器上以零值结束。还有其他陷阱。见讨论here
    • 好的,谢谢!所以没有找到类似的..我也没有。对不起!
    • @GMan:出于好奇:那里有任何正在积极使用的赞美机器吗?
    • @GMan:谢谢,我找不到那个问题。我会编辑答案。
    【解决方案4】:

    这个怎么样?

    C++ 代码:

    #include <limits>
    
    std::size_t temp = std::numeric_limits<std::size_t>::max();
    

    C 代码: 请看question

    我觉得这样比较合适。

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 2011-11-19
      • 2015-03-12
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      相关资源
      最近更新 更多