Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
У меня вопрос по поводу типов переменных, int, uint, char, short ushort и т.д. Новый компилятор выдает предупреждения о возможной потере данных из-за преобразования типов, поэтому лучше всего;
a) использовать тот тип, который лучше всего соответствует требованиям переменной или,
b) избегать преобразования между типами и поэтому использовать int для всего. (ну, для всего, что не требует плавающей точки).
У меня вопрос по поводу типов переменных, int, uint, char, short ushort и т.д., является ли лучшей практикой;
a) использовать тот тип, который лучше всего соответствует требованиям переменной или
b) избегать конвертации между типами и поэтому использовать int для всего. (ну, для всего, что не требует плавающей точки).
Под явным преобразованием типов вы подразумеваете, что преобразование выполняется перед любыми вычислениями между различными типами?
Если вам нужен беззнаковый long, то int не подойдет... используйте правильный тип и явное преобразование типа. IMO
Под явным преобразованием типов вы подразумеваете, что преобразование выполняется перед любыми вычислениями между различными типами?
Хорошая статья, спасибо angevoyageur Я прочитаю ее как следует, когда вернусь домой с работы.
Под явным приведением типа вы имеете в виду, что преобразование должно выполняться перед любыми вычислениями между различными типами?
Нет, я имею в виду, что вы можете преобразовать ulong в int следующим образом...
Хорошо, да, я так и думал, что вы имели в виду.
Только я не спрашивал об ulong. Мне редко, если вообще когда-либо, придется работать с такими большими значениями, которые не может вместить 32-битное целое число. Я даже не знаю, как сказать, какое число может хранить 64-битное целое число, lol...
Возможно, мне следовало быть более конкретным, у меня не было времени сегодня утром, чтобы написать свой вопрос должным образом, но теперь, когда я дома, я это сделаю.
В старом mql4 мы использовали целое число для всего. Мы писали for(int i=0; i<100; i++) Нам не нужны отрицательные значения, и нам не нужно значение больше 100, поэтому мы можем использовать uchar для этого. Значит ли это, что именно так мы и должны поступать?
Когда я смотрю на код других программистов, кажется, что многие из них используют 32-битные целочисленные типы. Есть ли для этого веская причина? Что они знают такого, что мне еще предстоит узнать? Использование наименьших типов переменных в программе создает головную боль из-за проблем с типизацией без какой-либо причины, кроме как немного меньшего размера файла? Или это экономит много оперативной памяти? Можно ли считать, что если значение одного типа может быть адаптировано к другому типу, то это можно делать? Использует ли приведение типов между различными типами намного больше CPU, чем использование одного типа?
Обновление: Я изучал этот вопрос и прочитал ответ на аналогичный вопрос на stackoverflow.com
"С точки зрения производительности, int быстрее почти во всех случаях. Процессор создан для эффективной работы с 32-битными значениями.
С более короткими значениями работать сложнее. Чтобы прочитать, скажем, один байт, процессор должен прочитать 32-битный блок, который его содержит, а затем замаскировать верхние 24 бита.
Чтобы записать байт, он должен прочитать конечный 32-битный блок, перезаписать младшие 8 бит желаемым значением байта и снова записать весь 32-битный блок.
С точки зрения пространства, конечно, вы экономите несколько байт, используя меньшие типы данных. Так что если вы создаете таблицу с несколькими миллионами строк, то более короткие типы данных, возможно, стоит рассмотреть. (И то же самое может быть хорошей причиной, почему вы должны использовать меньшие типы данных в своей базе данных).
И с точки зрения корректности, int не так легко переполняется. Что если вы думаете, что ваше значение поместится в байт, а потом в какой-то момент в будущем какое-то безобидное на вид изменение в коде приведет к тому, что в нем будут храниться большие значения?
Это некоторые из причин, по которым int должен быть вашим типом данных по умолчанию для всех интегральных данных. Используйте байт только в том случае, если вы действительно хотите хранить машинные байты. Используйте шорт, если вы имеете дело с форматом файла, протоколом или чем-то подобным, который действительно определяет 16-битные целочисленные значения. Если вы просто имеете дело с целыми числами вообще, делайте их ints".
Да, я так и думал, что вы имели в виду.
Только я не спрашивал об ulong. Мне редко, если вообще когда-либо, придется работать с такими большими значениями, которые не может вместить 32-битное целое число. Я даже не знаю, как сказать, какое число может хранить 64-битное целое число...
Возможно, мне следовало быть более конкретным, у меня не было времени сегодня утром, чтобы написать свой вопрос должным образом, но теперь, когда я дома, я это сделаю.
В старом mql4 мы использовали целое число для всего. Мы писали for(int i=0; i<100; i++) Нам не нужны отрицательные значения, и нам не нужно значение больше 100, поэтому мы можем использовать uchar для этого. Значит ли это, что именно так мы и должны поступить?
uchar - беззнаковый символ, зачем использовать его в цикле? Это не имеет смысла... используйте int. Вы будете работать с улонгами, вот что такое новое время даты ... и когда вы набираете текст, не думая об этом, в будущем вы получите предупреждение ... смиритесь с предупреждением или проигнорируйте его. Не надейтесь на лучшее, делайте то, что вы делаете сейчас, учитесь и понимайте.
То, что вы разместили на stackoverflow, имеет смысл для меня, я думаю, это хороший совет.
Между разными размерами используется больше процессора, но не намного больше. Просто разные инструкции, как упомянутые 32-битные fetch, isolate, operate, place, write, при модификации char в структуре. Так же, как умножение на 0.5 использует немного меньше CPU, чем деление на 2.0.
Экономия 16 бит на элемент массива не имеет смысла на GB машинах, я делал это, когда реализовывал приложение, базу данных, GUI (vt100) в 8 KB (sic.) Переход на 64 бита на (для всего) не будет иметь смысла, пока 128 битные платформы не станут обычным явлением.
Между знаковыми и беззнаковыми нет никакой разницы. Это просто присваивание, никакие биты не меняются. Разница заключается в коде, который использует переменную. Например, A[index] делает Address(a) + index * sizeof(a[0]), где плюс - знаковое или беззнаковое сложение.Для ясности кодирования я бы использовал uint для индексации массивов, так как A[-1] не имеет смысла, но тогда обратный отсчет проблематичен FOR(uint iA=n; iA >= 0; iA--){} iA>=0 всегда истинно.
Используйте int (или uint), если это не требуется по другим причинам.