无符号和整数之间的整数提升

问题描述

Here

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

从内存中,C的整数提升规则(关于C ++的idk)产生足够宽的类型以适合计算结果,并偏爱无符号类型(对于额外的宽度)。但是3的类型为int(对吗?)。那么,为什么类型为unsigned而不是intlong的结果呢? 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用于签名大小值。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...