Предположения о неявных преобразованиях типа данных

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

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

Следующее является некоторыми правилами преобразования, которые применяются, когда операнды имеют различные типы данных. Правила основаны на Стандарте ANSI C99.

  • Если обоими операндами является 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. Поэтому Пользовательская проверка утверждения является красной.

#include <assert.h>
int func(void) {
    int x = -2;
    unsigned int y = 5;
    assert(x <= y);
}

В этом примере, в первом assert оператор, x неявно преобразован в unsigned int перед операцией x <= y. Из-за этого преобразования, во втором assert оператор, x больше или равен нулю. Пользовательское утверждение проверяет второй assert оператор является зеленым.

int input(void);

void func(void) {
    unsigned int y = 7;
    int x = input();
    assert ( x >= -7 && x <= y );
    assert ( x >=0 && x <= 7);
}