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

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

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

Author24 — интернет-сервис помощи студентам
Всем привет!
У меня путаница вышла со всем этим разнообразием типов данных в С++.
Вообще, тип 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2009, 20:16
Ответы с готовыми решениями:

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

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

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

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

42
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.11.2009, 15:43 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от odip Посмотреть сообщение
Хочешь 64-битный тип - лучше используй int64_t, чем некий long long.
Человек не спрашивал что лучше. Он хочет разобраться с базовыми типами языка

Цитата Сообщение от odip Посмотреть сообщение
2Evg: Меня не интересует упаковка long double в структуры, которую ты пытаешься проверить.
Меня интересует сколько реально занимает типа long double.
Вопрос филосовский. Ибо одиночная переменная до фонаря сколько занимает, если при любом раскладе компилятор строит код, который читает-пишет только с 80 битами. Реально выдерживать соглашения нужно только в массивах и структурах.
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
03.11.2009, 15:45 22
Человек не спрашивал что лучше. Он хочет разобраться с базовыми типами языка
long long - не базовый тип.
int64_t - есть по стандарту C99.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.11.2009, 15:47 23
Цитата Сообщение от gromo Посмотреть сообщение
То есть всё это, что ты написал, полностью соответствует той таблице?
Не знаю. Хз на кого рассчитана та статья, но без поллитры и валидола я не в состоянии её читать

Цитата Сообщение от gromo Посмотреть сообщение
P.s Типы "long long" и им подобные у меня не работают. Проверял. Создать переменную такого типа
не получается; пишет, что некорректно. (illegal).
Значит твой компилятор их не поддерживает (ибо в старых стандартах этого типа точно нет)

Добавлено через 51 секунду
Цитата Сообщение от odip Посмотреть сообщение
long long - не базовый тип.
Базовый, но не стандартный

Цитата Сообщение от odip Посмотреть сообщение
int64_t - есть по стандарту C99.
На 100% не уверен, но по-моему это typedef
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
03.11.2009, 15:50 24
А еще обратите внимание, коллеги, что тип int64_t есть в Стандарте C99, но отсутствует в Стандарте C++03.
0
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
03.11.2009, 15:52 25
Цитата Сообщение от Evg Посмотреть сообщение
На 100% не уверен, но по-моему это typedef
Так и есть.
Код
[serg@localhost ~]$ cpp /usr/include/stdint.h | grep int64_t
typedef long long int int64_t;
typedef unsigned long long int uint64_t;
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
03.11.2009, 15:57  [ТС] 26
Цитата Сообщение от Evg Посмотреть сообщение
Не знаю. Хз на кого рассчитана та статья, но без поллитры и валидола я не в состоянии её читать
Я сравнил, все сходится. А то когда я сам начал изучать, то в голове после этих типов образовалась каша. Но теперь, когда мне объяснил знающий человек, что-то прояснилось.
СПАСИБО ОГРОМНОЕ!!! ПОМОГЛИ!!!!!!!
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
03.11.2009, 15:59 27
На 100% не уверен, но по-моему это typedef
А какая разница что там ?
Главное что он точно 64-битный.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.11.2009, 16:03 28
Цитата Сообщение от Gravity Посмотреть сообщение
Так и есть.
Код
[serg@localhost ~]$ cpp /usr/include/stdint.h | grep int64_t
typedef long long int int64_t;
typedef unsigned long long int uint64_t;
Я имел в виду "не уверен, что int64_t" - встроенный в ЯЗЫК C99 тип. То, что где-то есть typedef с таким именем не даёт ответа на это

Цитата Сообщение от odip Посмотреть сообщение
А какая разница что там ?
Главное что он точно 64-битный.
1. По второму кругу: человек спрашивал не это, он хотел разобраться с базовыми типами. Наши высокоинтелектуальные дискуссии про то, как программировать правильно, ему пока не интересны, т.к. он ещё не освоил базу
2. Если в языке нет 64-битного базового типа, то какая в пень разница, есть typedef для int64 или нет - всё равно над переменными этого типа нельзя будет строить арифметику
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
03.11.2009, 16:15 29
Я имел в виду "не уверен, что int64_t" - встроенный в ЯЗЫК C99 тип. То, что где-то есть typedef с таким именем не даёт ответа на это
http://ru.wikipedia.org/wiki/Printf
Второй стандарт языка Си (1999) предусматривает расширенный набор псевдонимов целочисленных типов данных intN_t, uintN_t, int_leastN_t, uint_leastN_t, int_fastN_t, uint_fastN_t (где N — требуемая разрядность), intptr_t, uintptr_t, intmax_t, uintmax_t.
...

Теперь уверен ?
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.11.2009, 16:29 30
Если слово "псевдоним" трактуется как "typedef или define", то можно абсолютно точно сказать, что int64_t НЕ является встроенным типом языка (в чём я почти не сомневался, но мало ли чего порешили разработчики стандарта)
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
03.11.2009, 17:54  [ТС] 31
Извините за тупость, но у меня ещё такой вопрос:
Если где-то говорится, например тип int или short, или long, то если явно не указано, что они "unsigned" подразумевается, что они "signed"?
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.11.2009, 18:06 32
Цитата Сообщение от gromo Посмотреть сообщение
Если где-то говорится, например тип int или short, или long, то если явно не указано, что они "unsigned" подразумевается, что они "signed"?
В стандарте это остаётся на усмотрение разработчику компилятора, но большинство "нормальных" компиляторов по умолчанию рассматривают тип как знаковый. В случаях для сигнальных процессоров и т.п. сие может быть по другому
1
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
03.11.2009, 18:28  [ТС] 33
Ну, я когда пишу

C++
1
2
3
4
5
#include <iostream.h>
void main() {
    int ival=-5;
    cout <<ival <<endl;
}
на экран выводится -5. После компиляции, ошибок и предупреждений не выдаёт.

Значит, по умолчанию целые типы рассматриваются как знаковые?
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.11.2009, 18:31 34
А я тебе что писал?
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
03.11.2009, 18:37  [ТС] 35
Ну я просто подумал, а вдруг мой компилятор исключение из правил? Ну мало ли...
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.11.2009, 18:43 36
да не... не на столько
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
03.11.2009, 18:52  [ТС] 37
Ну, спасибо за всё!
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
03.11.2009, 18:54 38
Цитата Сообщение от Evg Посмотреть сообщение
В стандарте это остаётся на усмотрение разработчику компилятора, но большинство "нормальных" компиляторов по умолчанию рассматривают тип как знаковый. В случаях для сигнальных процессоров и т.п. сие может быть по другому
Смотря какой стандарт. В C++97 и C99 они явно знаковые (кроме char, который не равен ни signed char, ни unsigned char и может быть либо знаковым, либо беззнаковым)
C++ 97, 3.9.1 Fundamental types
2 There are four signed integer types: "signed char", "short int",
"int", and "long int." In this list, each type provides at least as
much storage as those preceding it in the list. Plain ints have the
natural size suggested by the architecture of the execution
environment15) ; the other signed integer types are provided to meet
special needs.
C99, 6.2.5 Types
Здесь, кстати, и long long есть
4 There are five standard signed integer types, designated as signed char, short
int, int, long int, and long long int. (These and other types may be
designated in several additional ways, as described in 6.7.2.) There may also be
implementation-defined extended signed integer types.28) The standard and extended
signed integer types are collectively called signed integer types.29)
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.11.2009, 18:55 39
Somebody, просто в более поздние стандарты, судя по всему, включают то, что постфактум уже и так делается несколько лет
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
03.11.2009, 23:23 40
можно абсолютно точно сказать, что int64_t НЕ является встроенным типом языка (в чём я почти не сомневался, но мало ли чего порешили разработчики стандарта).
Не пойму к чему ты все время клонишь.
Тип есть, пользоваться им можно.

Добавлено через 1 минуту
Куда его реально определили разработчики компилятора - это уже тебя сильно мучить не должно.

Добавлено через 47 секунд
long long есть
Только он может совпадать с обычным long по размеру

Добавлено через 58 секунд
Visual Studio 2005 и Visual Studio 2008 НЕ ПОДДЕРЖИВАЮТ C99.
Насчет VS2010 не знаю - релиз еще не вышел, пробовать не хочу
0
03.11.2009, 23:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2009, 23:23
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru