【问题标题】:string::length returns false value?string::length 返回假值?
【发布时间】:2018-02-18 14:40:21
【问题描述】:
string str = "abcdef";
cout << str.length() << endl; //6
cout << str.length() - 7 << endl; //4294967295

我不明白为什么 str.length() - 7 返回 4294967295 而不是 -1。

你能帮我解释一下吗?

【问题讨论】:

  • See this 深入了解给您的答案。您会看到答案 -1,只是您看到 -1 的形式不同(未签名而不是签名)。
  • @PaulMcKenzie - 无符号类型的值不能为 -1。但是,当它被分配一个负值时,该值将使用模算术进行转换。结果可以但不一定具有与具有相同大小且值为-1 的有符号整数变量相同的按位表示

标签: c++ string string-length


【解决方案1】:

str.length()的返回类型为size_t

size_t length() const noexcept;

对于这种情况,您可以将其视为unsigned int

无符号整数在达到负值时下溢,回绕并进入另一个极端,导致在你的系统中看到 4294967295。

4294967295 (2^32 - 1) 对应于 32 位无符号类型的最大值 - 这与少数 32 位实现一致。此外,size_t 可以是,但不是必须是 32 位类型。

【讨论】:

  • 可能需要注意,4294967295 的值对应于 32 位无符号类型的最大值——这与少数 32 位实现一致。 size_t 可以是,但不是必须是 32 位类型。
【解决方案2】:

str.length() 返回一个size_t,它是无符号的。这个无符号结果环绕,这就是为什么你得到 4294967295 而不是 -1。

【讨论】:

  • ...因为无符号数字环绕...这是您忘记提及的重要部分。
猜你喜欢
  • 2017-10-19
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 2020-11-16
  • 2017-11-12
相关资源
最近更新 更多