С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/82: Рейтинг темы: голосов - 82, средняя оценка - 4.95
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225

Вопрос о типах данных С++

02.11.2009, 20:16. Показов 15712. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
У меня путаница вышла со всем этим разнообразием типов данных в С++.
Вообще, тип long double должен занимать 3 машинных слова (или 12 байт).
Но вот когда я пишу :
C++
1
2
3
4
5
6
7
#include <iostream.h>
#include <cstddef>
void main() {
    long double qq=10;
    size_t qwer=sizeof qq;
    cout <<qwer <<endl;
}
то в результате выводится значение 8. А почему???

И вот я ещё нашел кое-что по типам данных :
http://www.cppreference.com/wiki/ru/data_types
Как понимать таблицу в пункте "Модификаторы типа"?
Если типы long и long int написаны в одной строке, то что...ОНИ ОДИНАКОВЫ???

Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2009, 20:16
Ответы с готовыми решениями:

Ошибка в типах данных?!
Есть строка вида 3е-07 15, разбиваю split и записываю значение в ячейку. Но записывается значение 3е-02. В чем мб проблема?! Добавлено...

Ошибка в типах данных
Нужно составить условие вида: if abs(c-m) = abs(m-a) and abs(d-k)= abs(k-b)then writeln ('Точка находится внутри прямоугольника') else...

Различия в типах данных
Создаю БД MySQL 5.5. Для текстовых полей я нашел 4 типа: -char; -text; -varchar. Объясните подробно отличия этих типов. Для...

42
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
02.11.2009, 20:31
По умолчанию 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
Цитата Сообщение от gromo Посмотреть сообщение
У меня путаница вышла со всем этим разнообразием типов данных в С++.
Вот что дал Bulder 6
sizeof(int): 4
sizeof(__int64): 8
sizeof(long): 4
sizeof(float): 4
sizeof(double): 8
sizeof(long double): 10
sizeof(char): 1
sizeof(short): 2
Естественно это длинна в байтах
1
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
02.11.2009, 21:55
2gromo: Что у тебя за компилятор и что за OC ?

тип long double обычно занимает 10 байт, что соответствует внутреннему формату сопроцессора.

По умолчанию int означает то же, что и long int (раньше, кстати, было short int, потом перепилили).
Язык C требует чтобы было: sizeof(char)<=sizeof(short int)<=sizeof(int)<=sizeof(long).
Обычно для 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
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.11.2009, 22:18
Аналогично стандарт не накладывает никаких обязательств на реализацию типов 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
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
02.11.2009, 22:41
Для intel'а как правило sizeof (long double) равен 12 (т.е. 96 бит), при этом 80 бит являются значащими, а 16 бит не используются (нужны как padding для выравнивания).
Чего-то мне не попадались такие компиляторы - везде было sizeof(long double) == 10.
Да и АНК тоже самое пишет.
Выравнивание будет производиться, если ты начнешь структуру делать типа такой:
struct {
int i0;
long double ld0;
int i1;
}
Тогда очевидно что между ld0 и i1 по умолчанию будет добавлено 2 байта.
1
 Аватар для Gravity
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
02.11.2009, 22:44
Цитата Сообщение от odip Посмотреть сообщение
Чего-то мне не попадались такие компиляторы - везде было sizeof(long double) == 10.
GCC 4.3.4, sizeof(long double) == 12
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.11.2009, 22:52
Проверил в борландовском компиляторе - и вправду там размер 10. Если написать структуру из двух long double'ов, то sizeof будет 24. Если структуру из long double и двух char'ов, то sizeof будет 16. Исходя из этого получается что всё-таки отводится 12 байт. При этом то, что sizeof от long double'а выдаётся как 10 - на мой взгляд это косяк

Цитата Сообщение от odip Посмотреть сообщение
Тогда очевидно что между ld0 и i1 по умолчанию будет добавлено 2 байта.
Дырка между двумя полями вычисляется исходя из размера второго поля, а не первого
1
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
02.11.2009, 23:34
Цитата Сообщение от Evg Посмотреть сообщение
Если написать структуру из двух long double'ов, то sizeof будет 24. Если структуру из long double и двух char'ов, то sizeof будет 16.
А выравнивание данных надо бы поставить по-байтное. Тогда у структуры из двух long double'ов sizeof будет 20. А то можно получить sizeof и 32 у такой структуры!
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.11.2009, 23:44
Цитата Сообщение от АНК Посмотреть сообщение
А выравнивание данных надо бы поставить по-байтное. Тогда у структуры из двух long double'ов sizeof будет 20.
Я не знаю, как это на брланде и микрософте делать, но на gcc результаты такие

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <conio.h>
 
int main (void)
{
    struct s1 { long double a[2]; };
    struct s2 { long double a1, a2; };
    struct s3 { long double a[2]; } __attribute__((packed));
    struct s4 { long double a1, a2; } __attribute__((packed));
    struct s5 { long double a; char c; };
    struct s6 { long double a; char c; } __attribute__((packed));
    printf ("%d\n", sizeof(struct s1));
    printf ("%d\n", sizeof(struct s2));
    printf ("%d\n", sizeof(struct s3));
    printf ("%d\n", sizeof(struct s4));
    printf ("%d\n", sizeof(struct s5));
    printf ("%d\n", sizeof(struct s6));
    getch();
    return 0;
}
Code
1
2
3
4
5
6
24
24
24
24
16
13
Добавлено через 1 минуту
Цитата Сообщение от АНК Посмотреть сообщение
Тогда у структуры из двух long double'ов sizeof будет 20. А то можно получить sizeof и 32 у такой структуры!
Поля в структуре раскладываются не кому как захочется, а СТРОГО по программным соглашениям на архитектуру. Все компиляторы должны это делать одинаково (правда для упакованных полей наврядли в ABI что-то написано).
1
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
03.11.2009, 09:06
Цитата Сообщение от Evg Посмотреть сообщение
Поля в структуре раскладываются не кому как захочется, а СТРОГО по программным соглашениям на архитектуру
Абсолютно с вами согласен!

Параметрами выравнивания у компилятора Борланда можно управлять опцией -аХХ. По умолчанию стоит -а4, т.е. 10-байтные элементы в структурах выравниваются до 12-и байт.

Если поставить -а8, то для следующего примера
C++
1
2
3
4
5
6
7
8
9
10
  long double ld[2] = {0};
 
  struct {
    long double dd[2];
  } val;
 
  struct {
    long double d1;
    long double d2;
  } val2;
результат будет
sizeof(ld)=20
sizeof(val)=24
sizeof(val2)=32
А этой опцией можно управлять через окно Project Options на закладке Advanced Compiler.

Ну и, пожалуй, на этом всё. А то мы и так уже далеко ушли от темы...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.11.2009, 11:16
Это уже больше похоже на извраты конкретного компилятора, а не особенности языка Си\Си++
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
03.11.2009, 12:33  [ТС]
Компилятор у меня Microsoft Visual C++ 6.0.
Я просто сейчас изучаю преобразования типов и в книге говорится о таких типах, о
которых в предыдущих главах не было ни слова. Например, цитата из книги:

При приведении к целому типы char, signed char, unsigned char и short int
преобразуются в int. Тип unsigned short int трансформируется в int, если этот тип
достаточен для представления всего диапазона значений unsigned short int (обычно
это происходит в системах, отводящих полслова под short и целое слово под int), в
противном случае unsigned short int заменяется на unsigned int.
Я думал, что тип char может быть только unsigned char и signed char. А здесь говорится о char,
signed char и unsigned char как о трёх разных типах. И ещё какой-то тип unsigned short int.
Я не могу просто понять какие комбинации из ключевых слов можно составлять, чтобы получились
типы данных.

Добавлено через 15 минут
По ссылке http://www.cppreference.com/wiki/ru/data_types
Находится таблица со всеми возможными типами данных, но как её прочитать (эту таблицу) я что-то
не пойму.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.11.2009, 13:38
Цитата - какой-то бред. Либо выдрано из контекста и какие-то слова, не попавшие в цитату, могут прояснить ситуацию. Но я склоняюсь к тому, что это бред

Целые типы бывают знаковые и беззнаковые. Можно записывать по разному (одно из фривольностей языка Си). Для начала считай, что типы бывают следующие (со временем поймёшь, как оно на самом деле). В каждой строке несколько вариантов записи одного и того же типа, на первом месте ставлю наиболее употребительный

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
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
03.11.2009, 15:36
Насчет 64-битных все прогнал - нужно брать int64_t
Или __int64 для Visual Studio.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.11.2009, 15:37
Что именно прогнал?
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
03.11.2009, 15:38
GCC 4.3.4, sizeof(long double) == 12
Сейчас соберу gcc посвежее, проверю
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.11.2009, 15:38
Цитата Сообщение от odip Посмотреть сообщение
Сейчас соберу gcc посвежее, проверю
Программные соглашения написаны много лет назад и от свежести компилятора не зависят
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
03.11.2009, 15:40
Хочешь 64-битный тип - лучше используй int64_t, чем некий long long.

Добавлено через 1 минуту
2Evg: Меня не интересует упаковка long double в структуры, которую ты пытаешься проверить.
Меня интересует сколько реально занимает тип long double.
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
03.11.2009, 15:42  [ТС]
Evg

То есть всё это, что ты написал, полностью соответствует той таблице?
======================================== ======================================
P.s
Типы "long long" и им подобные у меня не работают. Проверял. Создать переменную такого типа
не получается; пишет, что некорректно. (illegal).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2009, 15:42
Помогаю со студенческими работами здесь

Биты в типах данных
У меня такая проблема: например есть две переменных типа short (16 bit) x1 и x2, и пусть x1 = 55, x2 = 12 их битовое представление 00000000...

Ошибка в типах данных
Здравствуйте. Помогите пожалуйста исправить ошибки в коде var p,it,a,m,b:integer; Procedure TForm1.Button1Click(Sender:...

видимо путаюсь в типах данных
Здравствуйте. Для понимая о чем говорим: #include &lt;iostream&gt; #include &lt;ctype.h&gt; #include &lt;clocale&gt; using namespace std; ...

Макрос. Ошибка в типах данных
Помогите исправить ошибку. В Макросе ошибка на выделенной строке и пишет несоответвие типов. Sub...

Ошибка в типах данных extended и string
Делаю программку на подобии теста, необходимо считывать тексты из нескольких Edit'ов и если они будет верными то используя счетчик...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru