【发布时间】:2019-09-17 13:34:33
【问题描述】:
我已经标记了警告位置。如果我理解正确地将两个 32 位数字相乘可以得到 64 位,那么我得到一个错误。
如果 C++ int 是 32 位,那么存储 64 位不也是溢出吗?请解释我做错了什么。警告消息显示在 Visual Studio 2019 中。
转换为更大的数据类型解决了这个问题。为什么?
#include <iostream>
using namespace std;
unsigned int m;
unsigned int n;
// Symbols
int symbols[] = { -1, 0, 1 };
unsigned int symbols_size = sizeof(symbols) / sizeof(symbols[0]);
// Returns false to signify that element exiting in array
bool check_symbol_validity(int val) {
for (unsigned int i = 0; i < symbols_size; ++i) {
if (symbols[i] == val) {
return false;
}
}
return true;
}
int main()
{
cout << "Place enter graph node count: ";
cin >> m;
n = m;
// Just a separator
cout << string(30, '#') << "\n";
cout << "Enter Transition Symbol Between Node i and Node j. \nIf none then enter -1.\n";
// Transition table, take node and symbol, return next node
//int* transition_table = new int[m * symbols_size]; // WARNING
int* transition_table = new int[(int64_t)m * symbols_size]; // OK
// Declare C++ dynamic array
//int* weight_matrix = new int[m * n]; // WARNING
//int* weight_matrix = new int[(long)m * n]; // WARNING
int* weight_matrix = new int[(long long)m * n]; // OK
// Store positional values for direct access rather than using multiplication
int* width_val_arr = new int[m];
// TAKE VALID INPUT
int user_input_value;
for (unsigned int i = 0; i < m; ++i) {
int tmp1 = i * m;
width_val_arr[i] = tmp1;
for (unsigned int j = 0; j < n; j++){
cout << "Enter connection between " << i << " and " << j << "\n";
cin >> user_input_value;
while (check_symbol_validity(user_input_value)) {
cout << "WRONG! ENTER CORRECT VALUE." << "\n";
cout << "Enter connection between " << i << " and " << j << "\n";
cin >> user_input_value;
}
weight_matrix[tmp1 + j] = user_input_value;
}
}
cout << string(30, '#') << "\n";
// SHOW THE WEIGHT MATRIX
for (unsigned int i = 0; i < m; ++i) {
//int tmp1 = i * m;
for (unsigned int j = 0; j < n; j++) {
cout << weight_matrix[width_val_arr[i] + j] << " ";
}
cout << "\n";
}
// Delete the dynamic arrays
delete[] weight_matrix;
delete[] transition_table;
delete[] width_val_arr;
}
警告信息:
“算术溢出:在 4 字节值上使用运算符 '*',然后将结果转换为 8 字节值。在调用运算符 '*' 之前将值转换为更广泛的类型以避免溢出”。
【问题讨论】:
-
我不明白你不明白什么。在您标记警告的地方,您还解决了取消注释行中的问题。 32 位乘以 32 位是 32 位结果。 64 位乘以 32 位是 64 位结果。
-
这看起来不像是错误。它类似于 C26450,一个代码分析警告。很难猜测正在使用什么规则,我当然无法从给定的来源复制它。无论如何,使用分析 > 配置来选择您要强制执行的规则。
标签: c++ visual-studio visual-studio-2019