推广和拓宽是一回事吗?

Is promotion and widening the same thing?

提升和加宽有区别吗,听说加宽只是积分提升。

加宽 "typically" 指的是 integral/floating 点类型(如 char 变为 longfloat 变为 double) , 但它也可以指字符加宽(如从 char 类型变为 wchar_t 类型)。

扩大转换也称为 "promotions",缩小转换称为 "coercion"。

"promotion" 和 "coercion" 的概念也可以在 OO 中使用,因为(多态性);如将基 class 提升为派生类型,或将派生类型强制转换为基。因为它仍然是 "widening" 和 "narrowing" 因为用于基础的地址 space 比派生类型 "less" (因此你是 widening/promoting 你的类型当 "up-casting",或 narrowing/coercing 你的类型时 "down-casting").

所以直接回答:Is there's a difference between promotion and widening .. 不,不是真的(除非你觉得迂腐),虽然我可能不会说 "widen that class type" 而不是 "promote that class type" 如果我在说话关于非整数(只是为了避免任何可能的初始混淆)。

这真的取决于上下文,因为术语 "widening" 是一个非正式术语,其含义会因讲故事的人而有所不同。我将描述一些常见的解释(但不是唯一的)。

在此之前,有必要描述一下什么是促销活动。 C++ 标准描述了整数提升(整数类型之间)和浮点提升(浮点类型之间)。整数类型和浮点类型之间的转换不描述为提升。

共同的特点是提升通常是保值的(除了使用模运算的有符号整数类型和无符号整数类型),但不需要增加变量的大小(或它可以表示的值的范围)。例如,short 可能会提升为 int,但 short 和 int 的大小也可能相同(尽管这取决于 implementation/compiler)。

C++ 标准根本不使用术语 "widening"(除了在库中的某些上下文中,与类型转换无关)。在整数和浮点转换的上下文中,一个常见的非正式含义是一种既能保持价值又能提升到更大类型的提升。该实现通常将结果中的附加位设置为零(即,使值更宽而不摆弄表示它的位)。因此,signed char 到 short、short 到 long、unsigned char 到 unsigned short 正在扩大转换(假设类型的 none 大小相等)。类似地,float 到 double 是一种扩大转换(标准保证 float 可以表示的值是 double 可以表示的值的严格子集)。从 int 到 double 的转换不是扩大(例如,不一定保留值,可能会弄乱位)。

加宽有时也用于描述从指向派生 class 的指针到指向基 class 的指针(或类似引用之间)的转换。反过来称为 "narrowing" 并且 - 在 C++ 中 - 只能通过显式类型转换来强制。