Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么int到long int的隐式转换在C++;?_C++_Type Conversion - Fatal编程技术网

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;
};