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

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

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

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

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

  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 або речовий, або покажчик на інтерфейс.

  4. А як припустимо мені конвертувати число вказане в типі даних char в int?
    Наприклад:
    int a;
    char b = '7';
    a = (int)b;
    cout << a;
    У мене виводить число 55 чомусь

    1. Я подивився відео про таблицю ASCII та зрозумів звідки ці числа з'являються при конвертації з char у int

Залишити коментар до Stilet Скасувати відповідь

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