#c #vector #visual-c #x86 #unsigned-long-long-int
# #c #вектор #visual-c #x86 #unsigned-long-long-int
Вопрос:
Когда я пытаюсь установить размер вектора с помощью unsigned long long в архитектуре x86, я вижу ошибку ниже:
unsigned long long sz;
vec.resize(sz);
ошибка C4244: ‘аргумент’: преобразование из ‘unsigned __int64’ в ‘const
unsigned int’, возможна потеря данных
Почему эта ошибка? каково поведение unsigned long long в архитектуре x86? Как установить размер вектора с помощью unsigned long long значение в архитектуре x86?
Комментарии:
1. Почему эта ошибка? — Прочитайте документацию . Где
unsigned long long
указан тип для использования?2. Размеры — size_t, а не unsigned long long
Ответ №1:
Используйте size_t sz
как обычный человек, это std::vector::resize(size_t)
ожидаемый тип аргумента, поэтому использование того же типа будет означать отсутствие неявного преобразования и, следовательно, сужения.
unsigned long long
это 64-разрядный тип, но size_t
только 32-разрядный, в 32-разрядном коде.
Вы не можете иметь std::vector
значение больше, чем SIZE_MAX
, поэтому бессмысленно использовать более широкий целочисленный тип. Это все, на что жалуется MSVC. Это не ошибка, если у вас никогда не было большого значения sz
, но вы, по-видимому, настроили MSVC на очень педантичный подход и рассматриваете предупреждения как ошибки.
В этом неявном преобразовании нет необходимости в первую очередь; избегайте его, используя соответствующий тип.
Комментарии:
1. MSVC не жалуется на бессмысленность использования более широкого целочисленного типа. Это предупреждает вас о неявных преобразованиях целых чисел, которые, на мой взгляд, являются самой большой ошибкой языка C . Смотрите документацию для C4244 . Это предупреждение для -W3 и -W4. Вы правы в том, что у запрашивающего явно установлен параметр -Werror , но я думаю, что вы слишком пренебрежительно относитесь к полезности этого предупреждения, особенно в общем случае.
2. @CodyGray: Спасибо, исправлено. Это то, что я имел в виду (что неявное преобразование было бессмысленным, а не предупреждение), но, конечно, если бы кто-то знал C достаточно хорошо, чтобы понять мою точку зрения из того, что я изначально написал, им не нужно было бы задавать вопрос. Мой ответ был простым, потому что изначально он должен был быть комментарием. Я надеялся на более интересный вопрос, основанный на названии, но vector
std::vector
не был вектором SIMD, и не было ничего специфичного для x86, просто платформа с 32-разряднойsize_t
версией. :/3. Ха-ха, да, я почувствовал разочарование с самого первого предложения. Я тоже усмехнулся.