Следующие две строки делают одно и то же:
lData = AnalogInputValue;
lData = (uint16)AnalogInputValue;
Почему?Тип назначения lData
имеет тип uint16
, поэтому значение, хранящееся в переменной AnalogInputValue
, необходимо будет преобразовать в uint16
в любом случае.Однако переменная AnalogInputValue
имеет тип sint16
.
Предупреждение исходит из следующего факта: переменные типа uint16
могут содержать значения в диапазоне 0..65535.Но переменные типа sint16
обычно могут содержать значения в диапазоне -32768..32767.Следовательно, если AnalogInputValue
содержит значение в диапазоне -32768 ..- 1, то это значение не может быть представлено uint16
.
. Поэтому перед выполнением присваивания можно добавитьнекоторый код вокруг него, который проверяет, что AnalogInputValue
не является отрицательным.Это означает, что он имеет значение от 0..32767.Все эти значения могут быть представлены в uint16
.А для другого случая, а именно, что проверка показывает, что AnalogInputValue
оказывается отрицательным, вам нужно найти какое-то приемлемое решение.
Здесь есть один потенциальный третий сценарий: вы на 100% уверены, что AnalogInputValue
никогда не будет иметь отрицательного значения, но логика слишком сложна для Polyspace, чтобы вывести этот факт, или данные поступают из внешнего источника (что, похоже, имеет место в данном случае, поскольку значение называется AnalogInputValue
).Затем добавление утверждения перед присвоением можно использовать как средство для указания Polyspace, что оно должно сделать это предположение.