Допущения о неявных преобразованиях типов данных

Если операция включает два операнда, верификация принимает, что перед выполнением операции операнды могут подвергаться неявному преобразованию типа данных. Происходит ли это преобразование, зависит от исходных типов данных операндов.

Ниже приведены правила преобразования, которые применяются, если операнды в двоичной операции имеют совпадающий тип данных. Оба операнда могут быть преобразованы в 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);
}