Існують дві схеми узгодження типів операндів у виразах: арифметичні перетворення типів і перетворення типів в операціях присвоєння.
Арифметичні перетворення типів застосовуються при узгодженні типів операндів в арифметичних і порозрядних операціях, а також в операціях порівняння. Вони базуються на «підтягуванні» операнда молодшого типу до старшого (цей процес ще називають просування типів – type promotion). Встановлено таку ієрархію типів:
char < short ≤ int ≤ long < float < double < long double
Для цілих типів додатково діє умова
signed тип < unsigned тип
Підтягування типів виконується за такою схемою:
1) всі операнди з типами char і short розширяються до типу int;
2) якщо старший операнд є одним з цілочислових типів, а молодший є цілим зі знаком, то молодший операнд розширюється до старшого через розмноження біта знака;
3) якщо старший операнд є цілим, а молодший – без знакове число, то молодший операнд доповнюється до розміру старшого нульовими бітами;
4) перетворення signed тип у unsigned тип не змінює двійкового коду числа;
5) якщо старший операнд є дійсним, а молодший – цілим, то виконується перетворення цілого типу в дійсний;
6) якщо обидва операнди є дійсними, то молодший розширюється до розміру старшого.
В операціях присвоєння діє правило перетворення типу виразу, записаного справа від знака =, до типу змінної чи l-операнда, яким присвоюється значення даного виразу. При цьому:
1) якщо тип змінної (l-операнда) зліва від знаку = старший за тип виразу справа від знаку =, то тип виразу підтягується до типу змінної за схемою, описаною вище;
2) якщо тип змінної (l-операнда) зліва від знаку = молодший за тип виразу справа від знаку =, то значення змінної перетворюється (обрізається) до типу змінної.
Пониження типів пов’язане з такими перетвореннями:
1) перетворення числового значення старшого дійсного типу до молодшого дійсного типу за умови, що воно потрапляє в діапазон значень молодшого типу, реалізується зменшення (через округлення) точності мантиси; інакше результат перетворення не визначений;
2) перетворення числового значення цілого типу до одного з молодших типів виконується через відкидання зайвих старших байтів числа; відкинуті старші байти втрачаються, що може призвести до втрати старших значущих розрядів числа, а для знакових типів додатково може відбутись зміна знака обрізаного числового значення;
3) перетворення unsigned тип у signed тип не змінює розмір та двійковий код числа, старший біт стає знаковим розрядом нового знакового числа; якщо він дорівнює одиниці – число вважається від’ємним;
4) перетворення значення дійсного типу до цілого полягає у відкиданні (без округлення) дробової частини числа; якщо ціла частина числа перевищує межі, допустимі для цілих типів, то результат перетворення не визначений.