c++;优先顺序-乘法前的强制转换 在C++函数下面,为什么数字[Max索引[1] [/COD] >转换为长Lo/,然后乘以数字[Max索引]?我以为你会把数字相乘然后施放
另外,将向量数类型设置为c++;优先顺序-乘法前的强制转换 在C++函数下面,为什么数字[Max索引[1] [/COD] >转换为长Lo/,然后乘以数字[Max索引]?我以为你会把数字相乘然后施放,c++,casting,long-integer,operator-precedence,C++,Casting,Long Integer,Operator Precedence,另外,将向量数类型设置为long-long而不是int是否更有意义,因此不需要强制转换 long long MaxPairwiseProductFast(const vector<int>& numbers) { int n = numbers.size(); int max_index1 = -1; cout << "value at max_index1 is " << numbers[max_index1] <&
long-long
而不是int
是否更有意义,因此不需要强制转换
long long MaxPairwiseProductFast(const vector<int>& numbers) {
int n = numbers.size();
int max_index1 = -1;
cout << "value at max_index1 is " << numbers[max_index1] << std::endl;
for(int i = 0; i < n; i++)
if((max_index1 == -1) || (numbers[i] > numbers[max_index1]))
max_index1 = i;
int max_index2 = -1;
for(int j = 0; j < n; j++)
if((numbers[j] != numbers[max_index1]) && ((max_index2 == -1) || (numbers[j] > numbers[max_index2])))
max_index2 = j;
return ((long long)(numbers[max_index1])) * numbers[max_index2];
}
int main() {
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; ++i) {
cin >> numbers[i];
}
long long result = MaxPairwiseProductFast(numbers);
cout << result << "\n";
return 0;
}
long-long MaxPairwiseProductFast(常量向量和数字){
int n=numbers.size();
int max_index1=-1;
cout>n;
向量数(n);
对于(int i=0;i>数字[i];
}
long long result=MaxPairwiseProductFast(数字);
库特
在执行乘法之前,数字[max_index2]
将提升为long
。
如果将两个int
相乘,结果溢出,则将该结果强制转换为long
,将无法实现任何效果,因此您必须先强制转换
,然后再进行乘法
将向量数类型设为long-long而不是int也没有意义,因此不需要强制转换
long long MaxPairwiseProductFast(const vector<int>& numbers) {
int n = numbers.size();
int max_index1 = -1;
cout << "value at max_index1 is " << numbers[max_index1] << std::endl;
for(int i = 0; i < n; i++)
if((max_index1 == -1) || (numbers[i] > numbers[max_index1]))
max_index1 = i;
int max_index2 = -1;
for(int j = 0; j < n; j++)
if((numbers[j] != numbers[max_index1]) && ((max_index2 == -1) || (numbers[j] > numbers[max_index2])))
max_index2 = j;
return ((long long)(numbers[max_index1])) * numbers[max_index2];
}
int main() {
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; ++i) {
cin >> numbers[i];
}
long long result = MaxPairwiseProductFast(numbers);
cout << result << "\n";
return 0;
}
如果您知道单个数字适合一个int
,但两个int的相乘结果可能溢出,这将有助于节省空间
在执行乘法之前,数字[max_index2]
将提升为long
。
如果将两个int
相乘,结果溢出,则将该结果强制转换为long
,将无法实现任何效果,因此您必须先强制转换
,然后再进行乘法
将向量数类型设为long-long而不是int也没有意义,因此不需要强制转换
long long MaxPairwiseProductFast(const vector<int>& numbers) {
int n = numbers.size();
int max_index1 = -1;
cout << "value at max_index1 is " << numbers[max_index1] << std::endl;
for(int i = 0; i < n; i++)
if((max_index1 == -1) || (numbers[i] > numbers[max_index1]))
max_index1 = i;
int max_index2 = -1;
for(int j = 0; j < n; j++)
if((numbers[j] != numbers[max_index1]) && ((max_index2 == -1) || (numbers[j] > numbers[max_index2])))
max_index2 = j;
return ((long long)(numbers[max_index1])) * numbers[max_index2];
}
int main() {
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; ++i) {
cin >> numbers[i];
}
long long result = MaxPairwiseProductFast(numbers);
cout << result << "\n";
return 0;
}
如果您知道单个数字适合一个int
,但两个int的相乘结果可能溢出,这将有助于节省空间
我想你会把数字相乘然后施放
假设您的两个操作数的值为std::numeric\u limits::max()
。这是int
可以表示的最大值,并且(因为它是正整数)将该数字平方的结果更大
当您将两个int
值相乘时,结果也是一个int
。请参见(特别是转换、整数提升和有符号类型溢出)
由于根据定义,结果大于可存储在int
中的最大值,因此使用int
s进行此乘法会产生未定义的结果。您需要使用足够大的类型执行乘法以存储结果
我想你会把数字相乘然后施放
假设您的两个操作数的值为std::numeric\u limits::max()
。这是int
可以表示的最大值,并且(因为它是正整数)将该数字平方的结果更大
当您将两个int
值相乘时,结果也是一个int
。请参见(特别是转换、整数提升和有符号类型溢出)
由于根据定义,结果大于可以存储在int
中的最大值,因此使用int
s进行乘法会得到一个未定义的结果。您需要使用足够大的类型来执行乘法。这不就是放括号的情况吗?括号太长了乘法是用long long而不是int来完成的,以防止int溢出。您可能认为强制转换很昂贵,但实际上并不昂贵。x86处理器有一条特殊的movsx
指令(使用符号扩展移动)它可以将int
动态转换为long
,同时将其加载到乘法的位置。因此它基本上是免费的。澄清此类代码的一种方法是使用静态转换
:而不是(long-long)数字[max_index1]
(注意没有多余和混乱的括号)到static\u cast(数字[max\u index1])
。这不只是放括号的情况吗?它被强制转换为long-long,因此乘法是用long-long而不是int来完成的,以防止int溢出。你可能认为强制转换很昂贵,但实际上并不昂贵。x86处理器有一条特殊的movsx
指令(带符号扩展名移动)可以将int
动态转换为long
,同时将其加载到乘法位置。因此基本上是免费的。澄清此类代码的一种方法是使用静态转换
:而不是(long-long)数字[max\u index1]
(注意没有多余的和令人困惑的括号)到静态转换(数字[max\u index1])
。