C++ 为什么int到long int的隐式转换在C++;?
我读到从C++ 为什么int到long int的隐式转换在C++;?,c++,type-conversion,C++,Type Conversion,我读到从int到long-long-int的转换是提升,因此认为不应该有任何问题,因为没有数据丢失,而不是相反的转换 但当我将两个大值的ints相乘并存储在long-long-int中时,它显示的是负数 例如: inta=1000000,b=1000000; 长整型c=a*b; cout乘法是以int的形式发生的,它会溢出,给出(在这种情况下,溢出是非常正常的-编译器+设置的组合甚至可以保证这一点),然后将结果转换为long 我认为您希望在乘法之前对其中一个参数进行转换,以便使用longs执行乘
int
到long-long-int
的转换是提升,因此认为不应该有任何问题,因为没有数据丢失,而不是相反的转换
但当我将两个大值的int
s相乘并存储在long-long-int
中时,它显示的是负数
例如:
inta=1000000,b=1000000;
长整型c=a*b;
cout乘法是以int
的形式发生的,它会溢出,给出(在这种情况下,溢出是非常正常的-编译器+设置的组合甚至可以保证这一点),然后将结果转换为long
我认为您希望在乘法之前对其中一个参数进行转换,以便使用long
s执行乘法:
long long c = static_cast<long long>(a)*b;
long c=static_cast(a)*b;
这样,在乘法发生之前,b
将被提升为long
,整个操作将安全地执行,并获得所需的结果。a*b
仍然是int
类型。计算后,结果将转换为long-long-int
。到那时,要避免溢出已经太晚了。在执行乘法之前,将其中一个值转换为long int
。试试这个:
#include <iostream>
int main()
{
int a = 1000000, b = 1000000;
long long int c = static_cast<long long int>(a)*b;
std::cout << c;
return 0;
};
#包括
int main()
{
int a=1000000,b=1000000;
长整型c=静态(a)*b;
std::cout因为将两个int
s相乘将导致另一个int
,该int
会附带所有溢出问题。然后(事后)将该int
提升为long-long-int
,这仍然意味着它不是您想要的
至少升级一个操作数,以升级另一个操作数,并获得所需的结果。这是因为使用int进行的操作会导致返回值(也是一个可能溢出的int),然后升级已经太晚了。我在使用“%lld”的C中尝试了同样的方法printf中用于打印的占位符。即使如此,它还是显示负值。可能是重复溢出导致未定义的行为?@Adrian Lis对于有符号整数,yesIt是为无符号整数定义的,但不是为有符号整数定义的。@Ap31更具体;)@AdrianLis注意我说的是int
,不是“整数类型”。我尽可能地具体!
#include <iostream>
int main()
{
int a = 1000000, b = 1000000;
long long int c = static_cast<long long int>(a)*b;
std::cout << c;
return 0;
};