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

C++ 无符号和整数之间的整数提升,c++,c++11,integer-promotion,C++,C++11,Integer Promotion,从内存中,C的整数提升规则(idk about C++)生成的类型宽度足以适应计算结果,并支持无符号类型(对于额外的宽度位)。但是3属于int类型(对吗?)。那么为什么类型的结果是无符号的而不是int或longunsigned肯定不够宽,无法捕获表达式的结果 string::length具有类型size\u t。对于x86-64平台,现代编译器将size\u t定义为uint64\u t。因此,3被提升为uint64\t。编译器无法将其升级为long或甚至long(也称为int64\u t),因


从内存中,C的整数提升规则(idk about C++)生成的类型宽度足以适应计算结果,并支持无符号类型(对于额外的宽度位)。但是
3
属于
int
类型(对吗?)。那么为什么类型
的结果是无符号的
而不是
int
long
unsigned
肯定不够宽,无法捕获表达式的结果

string::length
具有类型
size\u t
。对于x86-64平台,现代编译器将
size\u t
定义为
uint64\u t
。因此,3被提升为
uint64\t
。编译器无法将其升级为
long
或甚至
long
(也称为
int64\u t
),因为,例如,
(1
string::length
具有类型
size\u t
。对于x86-64平台,现代编译器将
size\u t
定义为
uint64\u t
。因此3被提升为
uint64\u t
。编译器无法将其提升为
long
,甚至
long
(又称
int64\u t
),因为,例如,
(1
s.长度()
是无符号的,因此在执行减法之前,
3
被提升为无符号。无符号减法的换行定义很好。有一篇讨论论文讨论了为什么使标准库容器大小类型无符号是一个问题,它们都应该有符号,但现在更改已经太晚了。例如,从c++20开始,有正是出于这个目的。
s.length()
是无符号的,因此在执行减法之前,
3
被提升为无符号。无符号减法的换行定义很好。有一篇讨论论文讨论了为什么使标准库容器大小类型无符号是一个问题,它们都应该有符号,但现在更改已经太晚了。例如,从c++20开始,有正是为了这个目的。
std::string s{ "aa" }; 
s.length() - 3;  // == very large number