【问题标题】:C++: Setting a uint32 to an int32 (negative value)C++:将 uint32 设置为 int32(负值)
【发布时间】:2018-03-23 15:44:36
【问题描述】:

我正在争论是否可以摆脱编译器警告。警告来自将 uint32 与 -1 进行比较。

现在仅仅看一眼,这似乎是一件不明智的事情,因为 uint32 永远不应该是负数,但我没有编写这段代码,也不熟悉 c++ 的做事方式,所以我问你。下面是一些示例代码来说明正在发生的事情。

  bool isMyAddressValid = false;
  unsigned int myAddress(-1);
  unsigned int translatedAddress;

  if(isMyAddressValid)
  {
      translatedAddress = 500;
  }
  else
  {
      translatedAddress = -1;
  }

  myAddress = translatedAddress;

  if(myAddress == -1)
  {
      std::cout << "ERROR OCCURED";
  }
  else
  {
      std::cout << "SUCCESS";
  }`

那么这是有效的代码吗?这是不是我不太理解的Cism?

【问题讨论】:

    标签: c++ error-handling compiler-warnings uint32 int32


    【解决方案1】:

    unsigned 类型设置为 -1 是将其设置为最大可能值的惯用方式,无论类型中的位数如何。

    一个更笨拙但也许更清晰的方法是写

    translatedAddresss = std::numeric_limits<decltype(translatedAddresss)>::max();
    

    【讨论】:

    • 或使用 UINT_MAX。
    • @NeilButterworth:但这包含了类型。 -1 适用于任何无符号类型。
    • 代码会进入 if(myAddress==-1) 块吗?
    • @TeeseCaprice:当然! -1 和你的类型的“最大值”是一回事。
    【解决方案2】:

    如果它在您的图书馆库中,我会使用 std::optionalboost::optional

    【讨论】:

      【解决方案3】:

      代码根据标准是有效的,赋值和相等检查都对其操作数应用整数转换。但是,使用哨兵值是 C 主义,我会使用异常来代替。

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2019-07-13
        • 2016-03-15
        相关资源
        最近更新 更多