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