Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/55: Рейтинг темы: голосов - 55, средняя оценка - 4.87
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 25
1

Тип данных long

07.02.2015, 12:08. Показов 11268. Ответов 47
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

1) long - это новый тип данных в c++?
2) Если первое верно, зачем вводить новый тип данных, если есть такой же int?
3) Если первое неверно, в чем отличие long от int?

Если я правильно понял, long - это long int. В языке C нет типа данных long, там int и long int. Вопрос: почему при компиляции переменной с типом long в языке C не выдается ошибка?

Спасибо.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2015, 12:08
Ответы с готовыми решениями:

Тип long long и его ввод\вывод с использованием scanf\printf
Добрый день! Мне в программе надо вывести и ввести, соответственно, некоторые данные с помощью...

Тип unsigned long long
Добрый день. У меня возник вопрос: Почему в результате выполнения программы выводится число: -1?...

Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p
Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в...

Создать абстрактный тип данных - класс вектор, который имеет указатель на long, число элементов и переменную состояния
Помогите пожалуйста, нужно написать код на с++ Создать абстрактный тип данных - класс вектор,...

47
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.02.2015, 11:34 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от globalhost Посмотреть сообщение
А на компиляторы старше 2011 это тоже распространяется?
Конечно. Это же фундаментальный принцип вычислений. Если операнды имеют тип арифметический тип T, то они не должны приводиться к более узкому типу без явных на то указаний со стороны программиста:
C++
1
2
3
long a = std::numeric_limits<int>::max()+1L;
long b = 20;
long c = a + b;
Если бы операнд "a" приводился автоматически к int была бы возможна потеря данных на совершенно ровном месте. Не было бы смысла во введении более широких чем int типов.
0
32 / 24 / 7
Регистрация: 01.08.2014
Сообщений: 115
09.02.2015, 15:28 42
Цитата Сообщение от Tulosba Посмотреть сообщение
Если бы операнд "a" приводился автоматически к int была бы возможна потеря данных на совершенно ровном месте. Не было бы смысла во введении более широких чем int типов.
А как же тип short?
Выражения с переменными short приводятся к int, а с переменными long не приводятся?

Пруф.
http://bukin.su/share/Книги/cpp/Prata_C++.pdf (стр. 74, "Преобразование данных в выражениях").
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2015, 15:50 43
Цитата Сообщение от globalhost Посмотреть сообщение
Выражения с переменными short приводятся к int
Это называется promotion, который по смыслу действует только в сторону расширения типа и только для char/short (в целочисленных выражениях)
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
09.02.2015, 16:13 44
Цитата Сообщение от Evg Посмотреть сообщение
типа и только для char/short (в целочисленных выражениях)
я несколько раз видел ассемблерный листинг типа такого
Assembler
1
2
3
mov al,5;
mov ah,10;
add al,ah;
что означает
C++
1
2
3
char a=5;
char b=10;
b+=a;
и такое
Assembler
1
2
3
mov bx,5;
mov ax,10;
add ax,bx;
что означает
C++
1
2
3
short a=5;
short b=10;
b+=a;
т.е без нужды не приводит типы к большему, да и не зачем если одна размерность

Добавлено через 15 минут
Цитата Сообщение от globalhost Посмотреть сообщение
Пруф.
читаем
"Преобразование данных осуществляется, когда в выражении содержатся данные разных типов"
о чем и говорил Tulosba
Цитата Сообщение от Tulosba Посмотреть сообщение
Зачем? Очевидно же, что это не так.
5/9 Expressions [expr]
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2015, 17:07 45
Цитата Сообщение от ValeryS Посмотреть сообщение
т.е без нужды не приводит типы к большему
По стандарту приводит. Ты видишь в коде результат работы оптимизаций. Т.е. в "нормальных" условиях коды

C
char a, b, c;
a = b + c; /* Предполагаем отсутствие promotion */
C
char a, b, c;
a = (char)((int)b + (int)c);
эквивалентны. Но помимо i386 в мире существует полно всяких различных процессоров, и вполне возможно, что на каком-то из них эти коды НЕ будут эквивалентны


К тому же ты, как и многие другие, ставишь "плохой" эксперимент, потому что для доказательства обратного используешь "хорошую" операцию. Замени операцию сложения на деление, и увидишь, что преобразование к int'у появится явным образом в коде

Добавлено через 33 минуты
Стандарт ISO/IEC 9899:1999 (E)

5.1.2.3 Program execution
...
10
EXAMPLE 2 In executing the fragment
char c1, c2;
/* ... */
c1 = c1 + c2;
the ‘‘integer promotions’’ require that the abstract machine promote the value of each variable to int size
and then add the two ints and truncate the sum. Provided the addition of two chars can be done without
overflow, or with overflow wrapping silently to produce the correct result, the actual execution need only
produce the same result, possibly omitting the promotions.
Добавлено через 1 минуту
Т.е. вариант построения кода на i386 отвечает требованиям "without overflow, or with overflow wrapping silently", т.к. переполнения не вызывают никаких сигналов (которые растут из аппаратных прерываний) и именно поэтому ты в коде не видишь операций преобразования в int
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.02.2015, 17:15 46
Цитата Сообщение от Evg Посмотреть сообщение
Ты видишь в коде результат работы оптимизаций.
В Стандарте сказано: 5/9:
... the integral promotions (4.5) shall be performed on both operands.
При этом 4.5 Integral promotions [conv.prom]
A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion
rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all
the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned
int.
Т.е. это как бы не совсем та оптимизация, которая задается ключами компилятора (если конечно, я тебя правильно понял), а рядовое поведение компилятора. Если целочисленное продвижение не требуется (по мнению компилятора), то оно и не будет выполнено. Те случаи, о которых говорит ValeryS.
1
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
09.02.2015, 17:34 47
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. в "нормальных" условиях коды
C++
1
2
char a, b, c;
a = b + c; /* Предполагаем отсутствие promotion */
C++
1
2
char a, b, c;
a = (char)((int)b + (int)c);
эквивалентны. Но помимо i386 в мире
или я чего то не понимаю или для х86 они как раз не эквивалентны
есть приведение/ нет приведения
у х86 есть команды для работы и с 1 и с 2 и с 4 байтами
так что
Цитата Сообщение от Evg Посмотреть сообщение
Замени операцию сложения на деление, и увидишь, что преобразование к int'у появится явным образом в коде
не вижу, если конечно не рассматривать что делимое расширяется до двойного размера(так это требование архитектуры а не языка Си), для результата один регистр для частного, другой для остатка,
а в умножении сомножители не увеличиваются, для результата два регистра(размерность удваивается)
но если взять ARM то там другое дело, сложение /вычитание для 32 бит вот там то и будет приведение к большему
вот там коды эквивалентны
правда появился режим THUMB, вот с ним я еще не разобрался
Цитата Сообщение от Evg Посмотреть сообщение
По стандарту приводит.
А смысл???
допустим складываю я два чара и получил переполнение, так если я приведу к инту сложу а результат опять к чару, то результат то будет одинаков

Добавлено через 7 минут
Цитата Сообщение от Evg Посмотреть сообщение
Добавлено через 33 минуты
отвечал пока ты уже расширил ответ
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. вариант построения кода на i386 отвечает требованиям "without overflow, or with overflow wrapping silently", т.к. переполнения не вызывают никаких сигналов (которые растут из аппаратных прерываний) и именно поэтому ты в коде не видишь операций преобразования в int
соответственно можно ли это назвать "требование" ужель от архитектуры зависит?
Я уже говорил что я прикладник, и мне эти тонкости как бы нафиг не нужны, работает и ладно
но иногда приходится заниматься "обратным инженерингом", и чаше всего для Винды, так что мои познания из практики
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2015, 17:53 48
Цитата Сообщение от ValeryS Посмотреть сообщение
или я чего то не понимаю или для х86 они как раз не эквивалентны
Под эквивалентностью я подразумевал что при одних и тех же значениях "a" и "b" в обоих кодах в "c" получится один и тот же числовой результат (т.е. без учёта взведения всяких флагов переполнения)

Цитата Сообщение от ValeryS Посмотреть сообщение
не вижу, если конечно не рассматривать что делимое расширяется до двойного размера(так это требование архитектуры а не языка Си)
Согласен, пример с делением был не в кассу

Цитата Сообщение от ValeryS Посмотреть сообщение
А смысл???
Лично для меня в языке Си немало мест, в которых я смысла не вижу. Язык разрабатывался в те года, когда памяти было мало, а процессоры были слабые. Поэтому, как мне кажется, некоторые вещи для людей тех времён очевидны и прозрачны, а нам непонятны. Но стандарт написан, а потому в вопросах "что будет" нужно ориентироваться именно на стандарт, а не на личные ощущения

Цитата Сообщение от ValeryS Посмотреть сообщение
соответственно можно ли это назвать "требование" ужель от архитектуры зависит?
Да, это по сути зависит от архитектуры

Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. это как бы не совсем та оптимизация, которая задается ключами компилятора
Никто не запрещает компилятору делать оптимизации и безо всяких ключей
0
09.02.2015, 17:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2015, 17:53
Помогаю со студенческими работами здесь

Не понятный undefined reference to `unsigned long long f<unsigned long long, void>
test.cpp: #include &lt;iostream&gt; template &lt;typename FormalType, typename FactType = typename...

Char, short, int, long: какой тип выбрать?
Всем привет Читая книги по C++ столкнулся с тем, что везде пишут примерно одно и тоже. Допустим...

Чем различаются long long и long double?
long long или long double

Как написать функцию c типом long double возвращаюшую тип shot?
Мне бы какой нибудь тривиальный пример в Си. Спасибо:)


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

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