C++:int转换为long是一种提升吗?

3

经过对网络的大量研究,我无法确定从int转换为long是否被视为提升。

我在微软网站上找到了以下代码 here

long  long_num1, long_num2;
int   int_num;

// int_num promoted to type long prior to assignment.
long_num1 = int_num;

然而,在cppreference网站上没有说明。

我理解升级是一种保持价值不变的转换(转换时不改变价值)。

有人能帮我弄清楚这个吗?

提前感谢。


最好将文本作为文本包含,而不是文本图像。 - super
1
这不是一种促销,也没有应用[conv.prom](请参见此处)。这是一种转换。 - Evg
2个回答

2
long  long_num1, long_num2;
int   int_num;

// int_num promoted to type long prior to assignment.
long_num1 = int_num;
文本错误。int_num没有被提升,因为它已经是一个int,所以这里不适用任何点。
赋值时,会发生隐式转换-从源类型到目标类型。因为long可以表示int的所有值,所以该值不会改变,并且int_num的值被转换为具有相同值的long

1
据我所知,由于intlong都具有相同的4字节大小,因此不会丢失数据。您可以通过运行以下代码来检查编译器是否同意此说法:
std::cout << sizeof(int) << ' ' << sizeof(long);

输出应该是“4 4”。这意味着它们都是相同的。 编辑:抱歉,感谢您纠正我。大小可能会有所不同,在引用它们时请使用sizeof

3
"int和long的大小都是4个字节"这一说法是不准确的,这会导致初学者错误地假设数据类型具有固定的大小并编写难以修复且不可移植的代码。实际上,int至少有16位,long至少有32位。请参见维基百科C数据类型。请参见64位数据模型了解最常见的整数大小。 - KamilCuk
1
这并不完全正确。你所得到的唯一保证是long至少和int一样宽(而且int至少有16位,这是从C语言中继承下来的)。在某些平台上,intlong的大小是不同的。 - IInspectable
@IInspectable -- 还需要确保 long 至少为32位。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接