С++: установка uint32 в int32 (отрицательное значение)

Я обсуждаю, могу ли я избавиться от предупреждения компилятора или нет. Предупреждение исходит от сравнения uint32 с -1.

Теперь, просто взглянув на него, это кажется неразумным, поскольку uint32 никогда не должен быть отрицательным, но я не писал этот код и не так хорошо знаком с тем, как это делать на С++, поэтому я спрашиваю вас. Вот пример кода, чтобы проиллюстрировать, что происходит.

  bool isMyAddressValid = false;
  unsigned int myAddress(-1);
  unsigned int translatedAddress;

  if(isMyAddressValid)
  {
      translatedAddress = 500;
  }
  else
  {
      translatedAddress = -1;
  }

  myAddress = translatedAddress;

  if(myAddress == -1)
  {
      std::cout << "ERROR OCCURED";
  }
  else
  {
      std::cout << "SUCCESS";
  }`

Так это действительный код? Это пришел Cism, который я не понимаю должным образом?


person TeeseCaprice    schedule 23.03.2018    source источник


Ответы (3)


Установка для типа unsigned значения -1 — это идиоматический способ установки его максимально возможного значения, независимо от количества битов в типе.

Более неуклюжим, но, возможно, более ясным способом было бы написать

translatedAddresss = std::numeric_limits<decltype(translatedAddresss)>::max();
person Bathsheba    schedule 23.03.2018
comment
Или используя UINT_MAX. - person ; 23.03.2018
comment
@NeilButterworth: Но это содержит тип. -1 работает для любого беззнакового типа. - person Bathsheba; 23.03.2018
comment
Будет ли код когда-либо помещаться в блок if(myAddress==-1)? - person TeeseCaprice; 23.03.2018
comment
@TeeseCaprice: Абсолютно! -1 и максимальное значение для вашего типа — одно и то же. - person Bathsheba; 23.03.2018

Если он есть в вашем арсенале библиотек, я бы использовал std::optional или boost::optional

person Robert Andrzejuk    schedule 23.03.2018

Код действителен в соответствии со стандартом, как присваивание, так и проверка на равенство применяют целочисленные преобразования к своим операндам. Однако использование дозорного значения - это C-ism, вместо этого я бы использовал исключение.

person Johan    schedule 23.03.2018