383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||
1 | ||||||
Вопрос о типах данных С++02.11.2009, 20:16. Показов 14157. Ответов 42
Метки нет (Все метки)
Всем привет!
У меня путаница вышла со всем этим разнообразием типов данных в С++. Вообще, тип long double должен занимать 3 машинных слова (или 12 байт). Но вот когда я пишу :
И вот я ещё нашел кое-что по типам данных : http://www.cppreference.com/wiki/ru/data_types Как понимать таблицу в пункте "Модификаторы типа"? Если типы long и long int написаны в одной строке, то что...ОНИ ОДИНАКОВЫ??? Спасибо!
0
|
02.11.2009, 20:16 | |
Ответы с готовыми решениями:
42
Ошибка в типах данных?! Ошибка в типах данных Различия в типах данных Биты в типах данных |
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
02.11.2009, 20:31 | 2 |
По умолчанию int означает то же, что и long int (раньше, кстати, было short int, потом перепилили). На архитектуре x86 double - самый крутой из встроенных типов с плавающей точкой. long double на этой архитектуре означает то же, что и double (хотя в некоторых вариантах long double - это 10-байтовое число с плавающей точкой). Этот тип никому не должен занимать 3 машинных слова.
1
|
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
|
|
02.11.2009, 20:35 | 3 |
1
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
02.11.2009, 21:55 | 4 |
2gromo: Что у тебя за компилятор и что за OC ?
тип long double обычно занимает 10 байт, что соответствует внутреннему формату сопроцессора. Обычно для 32-bit: sizeof(short int)==2 sizeof(int)==4 sizeof(long)==4 Для 64-bit: sizeof(short int)==2 sizeof(int)==4 sizeof(long)==8
1
|
02.11.2009, 22:18 | 5 |
Аналогично стандарт не накладывает никаких обязательств на реализацию типов float, double и long double. На большинстве архитектур float и double делаются соответственно 32- и 64-битными и работают в стандарте IEEE-754. Что касается long double - то он по разному сделан. Для intel'а как правило sizeof (long double) равен 12 (т.е. 96 бит), при этом 80 бит являются значащими, а 16 бит не используются (нужны как padding для выравнивания). Но некоторые компиляторы не умеют работать с long double и трактуют тип long double как эквивалент double'а (что НЕ противоречит стандарту). Иногда бывает, что это настраивается по опции. Так что присоединяюсь к вопросу предыдущего оратора: что у тебя за компилятор?
1
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
02.11.2009, 22:41 | 6 |
Да и АНК тоже самое пишет. Выравнивание будет производиться, если ты начнешь структуру делать типа такой:
1
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
02.11.2009, 22:44 | 7 |
1
|
02.11.2009, 22:52 | 8 |
Проверил в борландовском компиляторе - и вправду там размер 10. Если написать структуру из двух long double'ов, то sizeof будет 24. Если структуру из long double и двух char'ов, то sizeof будет 16. Исходя из этого получается что всё-таки отводится 12 байт. При этом то, что sizeof от long double'а выдаётся как 10 - на мой взгляд это косяк
Дырка между двумя полями вычисляется исходя из размера второго поля, а не первого
1
|
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
|
|
02.11.2009, 23:34 | 9 |
А выравнивание данных надо бы поставить по-байтное. Тогда у структуры из двух long double'ов sizeof будет 20. А то можно получить sizeof и 32 у такой структуры!
1
|
02.11.2009, 23:44 | 10 | |||||
Я не знаю, как это на брланде и микрософте делать, но на gcc результаты такие
Код
24 24 24 24 16 13 Поля в структуре раскладываются не кому как захочется, а СТРОГО по программным соглашениям на архитектуру. Все компиляторы должны это делать одинаково (правда для упакованных полей наврядли в ABI что-то написано).
1
|
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
|
||||||
03.11.2009, 09:06 | 11 | |||||
Абсолютно с вами согласен!
Параметрами выравнивания у компилятора Борланда можно управлять опцией -аХХ. По умолчанию стоит -а4, т.е. 10-байтные элементы в структурах выравниваются до 12-и байт. Если поставить -а8, то для следующего примера
Ну и, пожалуй, на этом всё. А то мы и так уже далеко ушли от темы...
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
03.11.2009, 12:33 [ТС] | 13 |
Компилятор у меня Microsoft Visual C++ 6.0.
Я просто сейчас изучаю преобразования типов и в книге говорится о таких типах, о которых в предыдущих главах не было ни слова. Например, цитата из книги: signed char и unsigned char как о трёх разных типах. И ещё какой-то тип unsigned short int. Я не могу просто понять какие комбинации из ключевых слов можно составлять, чтобы получились типы данных. Добавлено через 15 минут По ссылке http://www.cppreference.com/wiki/ru/data_types Находится таблица со всеми возможными типами данных, но как её прочитать (эту таблицу) я что-то не пойму.
0
|
03.11.2009, 13:38 | 14 |
Цитата - какой-то бред. Либо выдрано из контекста и какие-то слова, не попавшие в цитату, могут прояснить ситуацию. Но я склоняюсь к тому, что это бред
Целые типы бывают знаковые и беззнаковые. Можно записывать по разному (одно из фривольностей языка Си). Для начала считай, что типы бывают следующие (со временем поймёшь, как оно на самом деле). В каждой строке несколько вариантов записи одного и того же типа, на первом месте ставлю наиболее употребительный char, signed char: 8-битное знаковое unsigned char: 8-битное беззнаковое short, short int, signed short, signed short int: 16-битное знаковое unsigned short, unsigned short int: 16-битное беззнаковое int, signed int: 32-битное знаковое unsigned, unsigned int: 32-битное беззнаковое long, long int, signed long, signed long int: 32-битное знаковое для кодов с 32-битным режимом адресации и 64-битное знаковое для кодов с 64-битным режимом адресации unsigned long, unsigned long int: 32-битное беззнаковое для кодов с 32-битным режимом адресации и 64-битное беззнаковое для кодов с 64-битным режимом адресации long long, long long int, signed long long, signed long long int - 64-битное знаковое unsigned long long, unsigned long long int - 64-битное беззнаковое При этом типы "long long" поддерживаются не всеми компиляторами (но подавляющим большинством)
2
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
03.11.2009, 15:36 | 15 |
Насчет 64-битных все прогнал - нужно брать int64_t
Или __int64 для Visual Studio.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
03.11.2009, 15:38 | 17 |
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
03.11.2009, 15:40 | 19 |
Хочешь 64-битный тип - лучше используй int64_t, чем некий long long.
Добавлено через 1 минуту 2Evg: Меня не интересует упаковка long double в структуры, которую ты пытаешься проверить. Меня интересует сколько реально занимает тип long double.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
03.11.2009, 15:42 [ТС] | 20 |
Evg
То есть всё это, что ты написал, полностью соответствует той таблице? ============================================================================== P.s Типы "long long" и им подобные у меня не работают. Проверял. Создать переменную такого типа не получается; пишет, что некорректно. (illegal).
0
|
03.11.2009, 15:42 | |
03.11.2009, 15:42 | |
Помогаю со студенческими работами здесь
20
Ошибка в типах данных видимо путаюсь в типах данных Макрос. Ошибка в типах данных Ошибка в типах данных extended и string Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |