问题描述
std::string s{ "aa" };
s.length() - 3; // == very large number
从内存中,C的整数提升规则(关于C ++的idk)产生足够宽的类型以适合计算结果,并偏爱无符号类型(对于额外的宽度)。但是3
的类型为int
(对吗?)。那么,为什么类型为unsigned
而不是int
或long
的结果呢? unsigned
的宽度肯定不足以捕获表达式的结果!
解决方法
string::length
的类型为size_t
。对于x86-64平台,现代编译器将size_t
定义为uint64_t
。因此3被提升为uint64_t
。编译器无法将其提升为long
甚至是long long
(又名int64_t
),因为例如(1<<64) - 2
不能用带符号的64位整数表示。
如评论中所述,C ++ 20中有string::ssize
用于签名大小值。