4.3: Більше математики
- Page ID
- 29710
Добре, так що станеться, якщо додати або помножити два коротких Int разом і результат більше 16 біт довго? Ви закінчуєте з надмірним умовою. Зауважте, що компілятор не може попередити вас про це, тому що чи станеться це, буде повністю залежати від значень, введених користувачем і згодом обчислених в програмі. Сподіваємось, ви завжди будете розглядати випадки максимального значення та вибрати відповідні розміри даних, і це не буде проблемою. Але що насправді відбувається? Простіше кажучи, найбільш верхні біти будуть проігноровані. Розглянемо 8-бітове ціле число без знака. Він йде від 0 до 255. 255 представлений як вісім 1s. Що станеться, якщо до цього додати значення 1? Ви отримуєте 9-бітове число: 1, а потім вісім 0s. Цей дев'ятий біт викидається, оскільки змінна має лише вісім біт. Таким чином, 255 плюс 1 дорівнює 0! Це може створити деякі серйозні проблеми! Наприклад, припустимо, що ви хотіли використовувати цю змінну як лічильник циклів. Ви хочете пройти через петлю 500 разів. Цикл ніколи не закінчиться, тому що 8-бітове ціле число не може піднятися вгору, що високо. Ви продовжуєте додавати один до нього, але він продовжує гортати назад до 0 після того, як він досягає 255. Така поведінка не є поганою; насправді вона може бути використана з такими речами, як переривання та таймери, як ми побачимо.
Що станеться, якщо змішувати різні типи змінних? Наприклад, що станеться, якщо розділити double на int або float на ? C сприятиме меншому розміру/точності типів до більшого типу, а потім зробить операцію. Іноді це може представляти проблему, якщо ви намагаєтеся призначити результат назад чомусь меншому, навіть якщо ви знаєте, що він завжди «підійде». Компілятор буде скаржитися, якщо розділити doubleдовгий int на інший довгий int і спробувати призначити результат короткому int. Обійти це можна, використовуючи гіпс. Це ваш спосіб сказати компілятору, що ви знаєте, що є потенційна проблема, але йти вперед в будь-якому випадку (сподіваюся, тому що ви знаєте, що це завжди буде працювати, а не тільки тому, що ви хочете перемогти попередження компілятора). Кастинг в C подібний до перетворення типів у Python (наприклад, функція int ()). Ось приклад.
short int x, y=20; long int z=3; x=(short int)(y/z);
Зверніть увагу, як ви направляєте компілятор перетворити поділ на короткий Int. В іншому випадку результат насправді довгий int за рахунок просування y до рівня z. Яке значення x? Чому це 6 звичайно! Пам'ятайте, дробова частина безглузда, і, таким чином, втрачена, на цілих діленнях.
Кастинг також корисний при використанні математичних функцій. Якщо вам потрібно використовувати float, ви можете відкинути їх в/з double, щоб використовувати функції, визначені за допомогою double. Наприклад, припустимо, що a, b і c оголошені як float, але ви хочете використовувати функцію pow (), щоб підняти a до потужності b. pow () визначається як прийняття двох подвійних аргументів і повернення подвійної відповіді.
c = (float)pow( (double)a, (double)b );
Це дуже явний приклад. Багато разів ви можете покластися на акцію «мовчазного лиття», щоб зробити свою роботу за вас, як у прикладі з цілим числом вище. Іноді бути явним є гарною практикою просто як форма документації.
