【问题标题】:Integer promotion between unsigned and intunsigned 和 int 之间的整数提升
【发布时间】:2020-09-08 13:38:41
【问题描述】:

Here

std::string s{ "aa" }; 
s.length() - 3;  // == very large number

从内存中,C 的整数提升规则(关于 C++ 的 idk)产生了一个足够宽的类型以适应计算结果并支持无符号类型(用于额外的宽度)。但是3 的类型是int(对吗?)。那么为什么是unsigned 类型的结果而不是intlongunsigned 的宽度肯定不够足以捕捉表达式的结果!

【问题讨论】:

  • s.length() 是无符号的,所以 3 在做减法之前被提升为无符号。无符号减法的换行定义明确。有一篇讨论论文讨论了为什么使标准库容器大小类型无符号是一个问题,并且它们都应该被签名,但是现在改变已经太迟了。
  • 从 c++20 开始,std::ssize 就是为了这个目的。

标签: c++ c++11 integer-promotion


【解决方案1】:

string::length 的类型为 size_t。对于 x86-64 平台,现代编译器将 size_t 定义为 uint64_t。因此 3 被提升为uint64_t。编译器不能将其提升为long 甚至long long(又名int64_t),因为例如(1<<64) - 2 不能用有符号的64 位整数表示。 如 cmets 中所述,C++20 中有 string::ssize 用于有符号大小值。

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2013-08-08
    • 1970-01-01
    • 2017-06-20
    • 2012-02-21
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多