【问题标题】:What is this code doing? (size_t)-1这段代码在做什么? (size_t)-1
【发布时间】:2013-10-07 20:36:35
【问题描述】:

谁能解释当 size_t 或任何其他类型标识符被括在括号中时会发生什么。我知道这是旧的类型转换语法,但在这种情况下,我不了解正在发生的事情。

我已经看到它将类型的最大大小定义为:

size_t max_size = (size_t)-1

【问题讨论】:

  • 这是一个 C 风格的演员表。它将-1 转换为size_t,这可能会产生一个非常大的数字。
  • @juanchopanza: 准确的说是size_t可以代表的最大数量:)
  • @VladLazarenko 假设补码 :)
  • @juanchopanza:C++ 标准规定 size_t 是无符号的(因为它从 C 继承了关于它的规范)并且无符号整数类型使用模运算。
  • @jtetm 无论如何,获得size_t 最大值的C++ 方法是std::numeric_limits<size_t>::max()

标签: c++


【解决方案1】:

此代码(不必要地)将-1 强制转换为size_t。最可能的意图是在此系统上获得size_t 的最大可能值。

虽然这段代码没有未定义的行为,但这段代码很丑 - 在 C++ 中您应该使用 std::numeric_limits<size_t>::max() 而在 C 中使用 SIZE_MAX 宏正是为了获得最大的 size_t 值。

【讨论】:

  • 此代码具有明确定义的行为。您可能不喜欢它,但它已受到标准的认可。 (实际上是 C 和 C++ 标准。)在 C++(OP 标签)中,您应该使用 std::numeric_limits<size_t>::max()
【解决方案2】:

(size_t)-1实际上相当于size_t(-1)

另见以下问题c cast syntax styles

【讨论】:

    【解决方案3】:

    某些库方法有意返回(size_t)(-1) 以指示错误情况。例如,the iconv method from the GNU libiconv library。我认为这些函数不返回 ssize_t(有符号)返回值是有充分理由的,这将允许您直接检查 -1。

    【讨论】:

    • 您不会希望只为负错误代码专用 16 位。
    猜你喜欢
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多