Если операция включает два операнда, верификация принимает, что перед выполнением операции операнды могут подвергаться неявному преобразованию типа данных. Происходит ли это преобразование, зависит от исходных типов данных операндов.
Ниже приведены правила преобразования, которые применяются, если операнды в двоичной операции имеют совпадающий тип данных. Оба операнда могут быть преобразованы в int
или unsigned int
тип перед выполнением операции. Это преобразование называется целочисленным продвижением. Правила преобразования основаны на ANSI® C99 стандарт.
char
и signed short
переменные преобразуются в int
переменные.
unsigned short
переменные преобразуются в int
переменные, только если int
переменная может представлять все возможные значения unsigned short
переменная.
Для целей, где размер int
совпадает с размером short
, unsigned short
переменные преобразуются в unsigned int
переменные. Для получения дополнительной информации о размерах типов данных смотрите Target processor type (-target)
.
Типы, такие как int
, long
и long long
оставить без изменений.
Ниже приведены некоторые из правил преобразования, которые применяются, когда операнды имеют различные типы данных. Правила основаны на стандарте C99 ANSI.
Если оба операнда signed
или unsigned
операнд с более низким типом данных преобразуется в тип данных операнда с более высоким типом. Ранг увеличивается в порядке char
, short
, int
, long
, и long long
.
Если один операнд unsigned
и другой signed
, и unsigned
тип данных операнда имеет ранг выше или тот же, что и signed
тип данных операнда, signed
операнд преобразуется в unsigned
тип операнда.
Например, если один операнд имеет тип данных int
другой имеет тип unsigned int
, а int
операнд преобразуется в unsigned int
.
Этот пример показывает неявные преобразования, когда операнды в двоичной операции имеют совпадающий тип данных. При запуске верификации на примерах для просмотра преобразований можно использовать всплывающие подсказки на панели Source.
В первом сложении i1
и i2
не преобразуются перед сложением. Их сумма может иметь значения, выходящие за пределы области значений int
тип из-за i1
и i2
иметь полномасштабные значения. Поэтому проверка «Переполнение» при первом сложении оранжевая.
Во втором сложении c1
и c2
повышены до int
перед сложением. Сложение не переполнено, потому что int
переменная может представлять все значения, которые следуют из суммы двух char
переменные. Проверка Overflow для второго сложения зеленого цвета. Однако, когда сумма присваивается char
переменная, переполнение происходит во время преобразования из int
назад к char
. На Overflow появляется оранжевая проверка =
операция.
extern char input_char(void); extern int input_int(void); void main(void) { char c1 = input_char(); char c2 = input_char(); int i1 = input_int(); int i2 = input_int(); i1 = i1 + i2; c1 = c1 + c2; }
Следующие примеры показывают неявные преобразования, которые происходят, когда операнды в двоичной операции имеют различные типы данных. При запуске верификации на примерах для просмотра преобразований можно использовать всплывающие подсказки на панели Source.
В этом примере перед <=
операция, x
неявно преобразован в unsigned int
. Поэтому проверка типа «User assertion» имеет красный цвет.
#include <assert.h> int func(void) { int x = -2; unsigned int y = 5; assert(x <= y); }
В этом примере, в первом assert
оператор, x
неявно преобразован в unsigned int
перед операцией x <= y
. Из-за этого преобразования, во втором assert
оператор, x
больше или равно нулю. Проверка типа «User assertion» на втором assert
оператор зеленый.
int input(void); void func(void) { unsigned int y = 7; int x = input(); assert ( x >= -7 && x <= y ); assert ( x >=0 && x <= 7); }