C++中两个unsigned short相除结果为何是int类型?
为什么两个unsigned short类型变量做除法后结果是int?
先看你提供的测试代码,运行后确实会输出代表int类型的标识:
// Example program #include <iostream> #include <string> #include <typeinfo> int main(){ unsigned short a = 1; unsigned short b = 1; auto c = a/b; std::cout<<"result of dividing unsigned shorts is: "<<typeid(c).name()<<std::endl; }
出现这个结果的核心原因是C++的整数提升(integer promotion)机制。
当你对两个「小于int的整数类型」(比如unsigned short、short、char这类)执行算术运算时,编译器会自动把它们提升到int类型(特殊情况是如果原类型的所有取值范围没法被int容纳,才会提升到unsigned int,但在绝大多数现代系统里,unsigned short的取值范围是065535,而int的范围至少是-21474836482147483647,完全能装下unsigned short的所有值,所以会直接提升到int)。
具体到你的代码里,a/b这个除法运算执行前,变量a和b都会被先转换成int类型,整个表达式的结果自然就是int了,所以auto推导出来的c的类型就是int。
这种提升规则是C++标准里「常规算术转换」的一部分,目的是避免小整数类型运算时容易出现的溢出问题,同时统一运算的类型,让编译器处理起来更高效。
内容的提问来源于stack exchange,提问作者UweJ
相关产品推荐
相关产品推荐

