2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 25
|
|
1 | |
Тип данных long07.02.2015, 12:08. Показов 11268. Ответов 47
Метки нет (Все метки)
Здравствуйте.
1) long - это новый тип данных в c++? 2) Если первое верно, зачем вводить новый тип данных, если есть такой же int? 3) Если первое неверно, в чем отличие long от int? Если я правильно понял, long - это long int. В языке C нет типа данных long, там int и long int. Вопрос: почему при компиляции переменной с типом long в языке C не выдается ошибка? Спасибо.
1
|
07.02.2015, 12:08 | |
Ответы с готовыми решениями:
47
Тип long long и его ввод\вывод с использованием scanf\printf Тип unsigned long long Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p Создать абстрактный тип данных - класс вектор, который имеет указатель на long, число элементов и переменную состояния |
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
09.02.2015, 11:34 | 41 | |||||
Конечно. Это же фундаментальный принцип вычислений. Если операнды имеют тип арифметический тип T, то они не должны приводиться к более узкому типу без явных на то указаний со стороны программиста:
0
|
32 / 24 / 7
Регистрация: 01.08.2014
Сообщений: 115
|
|
09.02.2015, 15:28 | 42 |
А как же тип short?
Выражения с переменными short приводятся к int, а с переменными long не приводятся? Пруф. http://bukin.su/share/Книги/cpp/Prata_C++.pdf (стр. 74, "Преобразование данных в выражениях").
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
|||||||||||||||||||||
09.02.2015, 16:13 | 44 | ||||||||||||||||||||
я несколько раз видел ассемблерный листинг типа такого
Добавлено через 15 минут читаем
0
|
09.02.2015, 17:07 | 45 |
По стандарту приводит. Ты видишь в коде результат работы оптимизаций. Т.е. в "нормальных" условиях коды
C char a, b, c; a = b + c; /* Предполагаем отсутствие promotion */ C char a, b, c; a = (char)((int)b + (int)c); К тому же ты, как и многие другие, ставишь "плохой" эксперимент, потому что для доказательства обратного используешь "хорошую" операцию. Замени операцию сложения на деление, и увидишь, что преобразование к int'у появится явным образом в коде Добавлено через 33 минуты Стандарт ISO/IEC 9899:1999 (E) Т.е. вариант построения кода на i386 отвечает требованиям "without overflow, or with overflow wrapping silently", т.к. переполнения не вызывают никаких сигналов (которые растут из аппаратных прерываний) и именно поэтому ты в коде не видишь операций преобразования в int
1
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
09.02.2015, 17:15 | 46 |
В Стандарте сказано: 5/9:
1
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
|
09.02.2015, 17:34 | 47 |
или я чего то не понимаю или для х86 они как раз не эквивалентны
есть приведение/ нет приведения у х86 есть команды для работы и с 1 и с 2 и с 4 байтами так что не вижу, если конечно не рассматривать что делимое расширяется до двойного размера(так это требование архитектуры а не языка Си), для результата один регистр для частного, другой для остатка, а в умножении сомножители не увеличиваются, для результата два регистра(размерность удваивается) но если взять ARM то там другое дело, сложение /вычитание для 32 бит вот там то и будет приведение к большему вот там коды эквивалентны правда появился режим THUMB, вот с ним я еще не разобрался А смысл??? допустим складываю я два чара и получил переполнение, так если я приведу к инту сложу а результат опять к чару, то результат то будет одинаков Добавлено через 7 минут отвечал пока ты уже расширил ответ соответственно можно ли это назвать "требование" ужель от архитектуры зависит? Я уже говорил что я прикладник, и мне эти тонкости как бы нафиг не нужны, работает и ладно но иногда приходится заниматься "обратным инженерингом", и чаше всего для Винды, так что мои познания из практики
0
|
09.02.2015, 17:53 | 48 |
Под эквивалентностью я подразумевал что при одних и тех же значениях "a" и "b" в обоих кодах в "c" получится один и тот же числовой результат (т.е. без учёта взведения всяких флагов переполнения)
Согласен, пример с делением был не в кассу Лично для меня в языке Си немало мест, в которых я смысла не вижу. Язык разрабатывался в те года, когда памяти было мало, а процессоры были слабые. Поэтому, как мне кажется, некоторые вещи для людей тех времён очевидны и прозрачны, а нам непонятны. Но стандарт написан, а потому в вопросах "что будет" нужно ориентироваться именно на стандарт, а не на личные ощущения Да, это по сути зависит от архитектуры Никто не запрещает компилятору делать оптимизации и безо всяких ключей
0
|
09.02.2015, 17:53 | |
09.02.2015, 17:53 | |
Помогаю со студенческими работами здесь
48
Не понятный undefined reference to `unsigned long long f<unsigned long long, void> Char, short, int, long: какой тип выбрать? Чем различаются long long и long double? Как написать функцию c типом long double возвращаюшую тип shot? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |