从 'uint64_t' 转换为 'unsigned int'
conversion from 'uint64_t' to 'unsigned int'
对于 Microsoft Visual Studio 2015 RC 中的以下函数,我收到两个关于比较有符号和无符号变量的警告。
uint64_t findMin(vector<uint64_t> &v)
{
uint64_t min = 0;
uint64_t s = v.size();
for (uint64_t i = 0; i < s; ++i) {
if (v[i] != 0) { // WARNING
min = v[i]; // WARNING
break;
}
}
...
}
警告是
warning C4244: 'argument': conversion from 'uint64_t' to 'unsigned int', possible loss of data
这很奇怪,因为至少我确定 min
和 v[i]
都有 uint64_t
变量,这是显而易见的。
这与RC版有关吗?或者背后有什么我不知道的?
编译器警告的 "argument" 是 v[i]
中 operator[]
的 i
参数(请注意,这是这两行中唯一的参数).
此 operator[]
重载的参数类型为 size_t
。在 32 位版本中 size_t
是一个 32 位无符号整数。将 64 位无符号 i
转换为 32 位无符号参数类型是收缩转换。
对于 Microsoft Visual Studio 2015 RC 中的以下函数,我收到两个关于比较有符号和无符号变量的警告。
uint64_t findMin(vector<uint64_t> &v)
{
uint64_t min = 0;
uint64_t s = v.size();
for (uint64_t i = 0; i < s; ++i) {
if (v[i] != 0) { // WARNING
min = v[i]; // WARNING
break;
}
}
...
}
警告是
warning C4244: 'argument': conversion from 'uint64_t' to 'unsigned int', possible loss of data
这很奇怪,因为至少我确定 min
和 v[i]
都有 uint64_t
变量,这是显而易见的。
这与RC版有关吗?或者背后有什么我不知道的?
编译器警告的 "argument" 是 v[i]
中 operator[]
的 i
参数(请注意,这是这两行中唯一的参数).
此 operator[]
重载的参数类型为 size_t
。在 32 位版本中 size_t
是一个 32 位无符号整数。将 64 位无符号 i
转换为 32 位无符号参数类型是收缩转换。