Основи програмування на С ++ для початківців

Перетворення типів

Перетворення типів в С ++ досить давня, або точніше класична операція. Якщо коротко і по-російськи: перетворення типу – це вказівка ​​комп'ютера вважати якийсь набір байтів цілим або речовим. Або покажчиком на певний клас.

взагалі, щоб зрозуміти перетворення типів потрібно враховувати механізм і структуру змінних. К примеру, переменних цілого типу кілька: короткий INT, intдовго INT, беручи до уваги беззнакові. І комп'ютер розміщує для них різну кількість елементів пам'яті (байт): 1, 2 і 4 соответственно. Перетворення в рамках таких типів одного класу називається стандартним перетворенням.  в:

зробить наступне: візьме два молодших байти з змінною «А», і просто пересадить їх в два байта змінної «b». Оскільки значення в а (одиниця) цілком собі поміщається в ці два байта, програма дасть правильний результат, а С ++ не буде проти такого перетворення.

Чому потрібно враховувати розмір змінної при перетворенні?

Що буде якщо помістити в змінну «А» число 123456789? Воно прекрасно вміститься в 4 байта типу int, але в 2 байта типу короткий INT воно вже не потрапляє. занадто велика. С , як і годиться, просто відріже це довге число, взявши з нього тільки хвіст, і помістить в змінну «b». Отримаємо природно дурницю. Причому з мінусом, якщо вивести її на екран. Перетворення з змінної, яка займає більшу кількість байт в пам'яті не буде правильним. Якщо перетворювати навпаки з short в long наприклад таких проблем не буде, оскільки байтів в змінної-одержувачі більше, і місця для даних які зберігаєshort цілком вистачає.

Це потрібно знати. Викладачі часто ловлять студентів на такому фокусі, спеціально даючи в методичке подібний підводний камінь зі змінними погано сумісними один з одним за розміром.

Що стосується перетворення типів речового, цим займається математичний співпроцесор. Тут уже не просто байти перегоняются з осередків у клітинку, а виконуються спеціальні команди, які конвертують ціле в тип речового з мантиси і експонентою, як годиться, і повертають значення. Це не можна назвати перетворенням, це саме конвертація.В будь-якому випадку, цим буде займатися сам процесор.

В даному прикладі математичний співпроцесор перетворює речовий в ціле, і зажене в змінну, а потім зробить зворотну операцію: зажене ціле в свій спеціальний регістр (називається ST), і вже після з нього вистачить речовий з цілою частиною, рівною тій, що в змінній “а”.

Якщо ж потрібно перетворити з речового double (8 байт) в float (4 байта), то тут таких проблем, як з цілими, не буде. Математичний співпроцесор просто округлити речовий до значення, вміщається в 4 байта, що не приведе до неправильного значенням:

Результатом все одно буде число 1.234568e + 18, що означає 1.2-з хвостиком в 18-й ступеня. Інша справа, що в “a” вже буде округлене число до 6-го знака після коми, а не 1.234567891234566e + 18. В цілому для неточних обчислень це не заважає, але рекомендується в програмі використовувати речові одного типу, щоб не відбувалося такого ось округлення.

Крім перетворення типу є таке поняття як приведення типу.

Наочність приведення типу можна показати таким прикладом:

якщо перетворення – це рішення С ++ (а точніше компілятора), в який тип приводити, то приведення використовує тип, жорстко вказаний програмістом. В даному прикладі програміст каже компілятору, що потрібно перетворювати саме в int, а не в короткий INT. адже 25 поміщається і в int і в short, що вибере компілятор програміст може і не знати.

У побуті такі перетворення типів взагалі-то рідкісні. Та й не потрібні. Ідеологія програмування в побутових умовах натякає уникати таких викрутасів, оскільки вони можуть виявитися граблями (як в прикладі вище при перетворенні цілих), тому приведення типів в С ++ не варто використовувати повсюдно.

:) Дякую за цю статтю її автору Stilet – супер модератору форуму програмістів ProgrammersForum.

7 думки про "Перетворення типів

  1. Цей урок зовсім зрозумілий, переписати б цю статейку на більш зрозумілу мову:(

    1. Більш зрозумілий в якому плані?
      Перетворення типів адже працює на низькому рівні і взагалі залежить дуже сильно від оптимізації компілятора.
      Більш того перетворення типів дуже велика область і залежить (може залежати) від самих завдань, де застосовується перетворення.

      1. > Перетворення типів адже працює на низькому рівні
        1. Перетворення типів взагалі не “працюють” – ніяких дій не проводиться, ми просто вказуємо розглядати елемент даних в форматі якогось з типів даних.

        > взагалі залежить дуже сильно від оптимізації компілятора.
        2. Ніяк не залежить взагалі від компілятора. типізація – це суто синтаксичне поняття C ++ – для контролю і перевірок в тексті. Після компіляції вся інформація про типи повністю втрачається.

  2. Тип об'єкта даних (це як іменник в мові) визначає які дії (дієслово в мові) можна застосовувати до об'єкта.
    Наприклад, тип – “яблуко”, його можна: з'їсти, засушити і т.д.
    Але якщо ви перетворюєте його в тип “м'яч”, то ним можна грати в футбол … але його вже не можна з'їсти.

    1. Це помилкове твердження, оскільки після приведення типу значення своїх властивостей не змінює.

      Втім не бачу сенсу сперечатися – Отладчик все розсудить, хто захоче з його помошью цілком дізнається істину.

      1. > оскільки після приведення типу значення своїх властивостей не змінює.

        Ви пишете дурниці, Не турбуйся про те юнацтво…
        непідписаних довгий уль = 1234;
        – перетворимо:
        символ * шт = ++(char*)ul;
        скільки стане? … правильно ;-) = 1235
        – перетворимо:
        короткий * пс = ++(короткий *)ul;
        скільки стане? … правильно ;-) = 1236
        – перетворимо:
        uint32_t * пи = ++(uint32_t *)ul;
        скільки стане? … правильно ;-) = 1238
        і т.д.

  3. 1) Перетворення типів на прикладі цілого і дійсного може працювати на рівні процесора і його математичного модуля.

    2) Типізація це не просто “поняття”, і вже точно не тільки для контролю, якого в Сі як кіт наплакав. І навіть якщо інформація про типи не зберігати в екзешник, тільки матерія, обробляється процесором однозначно вказує на його тип будь то покажчик на ASCIIZ або речовий, або покажчик на інтерфейс.

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *