如何解决无符号和整数之间的整数提升
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
用于签名大小值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。