|
8 / 8 / 3
Регистрация: 20.05.2012
Сообщений: 174
|
|
Выбор типа для числа. Int или не Int23.07.2015, 14:10. Показов 3118. Ответов 19
Метки нет (Все метки)
Доброго дня форумчанам.
Я недавно начал писать на C# и меня беспокоит вопрос правильного выбора типа для числовых переменных (не считая выбор между int и double, т.к. они реализуют различный, как мне видится, функционал). Мне не совсем понятно, почему в большинстве примеров используется int, чем это мотивируется. Только ли для простоты примера? Помнится где-то читал, что хранение памяти в 64битных системах организовано таким образом, что там выгоднее использовать int. Так ли это или я не то запомнил? Если я задаю динамический массив или цикл for менее 255 элементов(итераций), имеет ли смысл менять привычный int на byte? (в случае массива, написать свой итератор с byte) Имеет ли смысл делать поля ID в форматах uint/ushort(когда классов не ожидается много) для явного исключения отрицательных значений? Я пока не ограничен по времени и хотел бы писать, по возможности, более оптимальный код, но, к сожалению, нету примеров/наставников ![]() Подскажите, чем вы руководствуетесь при выборе типа для числовых переменных?
0
|
|
| 23.07.2015, 14:10 | |
|
Ответы с готовыми решениями:
19
Составить рекурсивную функцию int DigitSum(int n) целого типа, которая находит сумму цифр целого числа n Какая из этих функций int Q(int w) int W(int y,int u,int i) сработает быстрее? В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.? |
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 23.07.2015, 14:16 | |||||
Сообщение было отмечено Kamerton как решение
РешениеВ большинстве случаев все типы, меньшие, чем int, при арифметических или побитовых операциях все равно будут увеличены до инта, так что можно не запариваться. Вещественное число для вычислений вроде физических — double. Вещественное число для вычисления финансов — decimal. Интероп, требующий беззнаковых чисел — ushort, uint, ulong. Прочий интероп — byte, short, int, long. Работа с данными вроде файловых или сетевых — byte.
3
|
|||||
|
|
|||
| 23.07.2015, 14:20 | |||
|
Кроме того, многие функции заточены именно под int. Например функции из Math. Или, например если вы обращаетесь к элементу массива, то в качестве индекса обычно принимается int. Если же у вас будет иной тип, то он будет преобразовываться к int. А это лишние операции. Другие дело хранение объектов в памяти. Если число явно не может быть отрицательным, то лучше конечно хранить в беззнаковом виде.
2
|
|||
|
|
||
| 23.07.2015, 14:20 | ||
|
Так же, надо учитывать, что при любых арифметических операциях более низкие целые (byte, short) неявно приводятся к Int32, и в таких случаях требуется явное приведение типов, что неудобно. Что касается знаковых-беззнаковых целых, тут все зависит от задачи, которую вы решаете.
1
|
||
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
|
||
| 23.07.2015, 15:14 | ||
|
Как быть, когда допустим стандартный класс List (ну или другие классы из библиотеки) использует int в качестве индекса, а длинна у меня должна быть больше, чем вмещает int, можно как то решить эту проблему или надо свой список делать? PS давно меня мучают эти вопрос с типами, но вот все ни как повода не было спросить.
0
|
||
|
|
|
| 23.07.2015, 15:29 | |
|
1
|
|
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
|
|||||||||||
| 23.07.2015, 15:45 | |||||||||||
|
insite2012, может я что то не так понял, я имею ввиду я создаю список строк:
0
|
|||||||||||
|
|
||
| 23.07.2015, 15:55 | ||
1
|
||
|
Master of Orion
|
||
| 23.07.2015, 16:30 | ||
|
VLK,
Добавлено через 6 минут Тем более ничего хорошего из этого всё равно не выйдет. Т.к. интерфейсы IList<T>, IReadOnlyList<T>, сам список, все свойства (Count, Size) имеют тип int. В результате нужно переписывать полностью весь неймспейс System.Collections.Generics для работы с лонгами. Добавлено через 1 минуту Так что даже если взять исходники - нужно будет писать класс, с которым нельзя будет нормально работать через интерфейсы (все элементы после первых двух миллиардов будут недоступны).
1
|
||
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
|
|
| 23.07.2015, 16:47 | |
|
insite2012, Psilon, понятно, у меня бывает появляется какой то вопрос (не к селу не к городу) и вот не успокоюсь, пока не получу ответ.
Мне вот интересно, а почему изначально все эти List и т.д. не используют uint, вроде как отрицательный индекс быть не может. ну или может, что то я такое припоминаю, вот только лучше обойтись без отрицательных, но за то в 2 раза больше, чем вмещает при использовании int. И еще, что бы не переделывать под long, можно сделать класс обертку, в который засунуть несколько списков и от этого отталкиваться, от индекса вычитать / прибавлять, столько, сколько первый вмещает список, что бы рыться во втором списке, как то так.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 23.07.2015, 16:52 | ||
|
Если бы не это, то в шарпе было бы четыре числовых типа: int, long, double, decimal.
0
|
||
|
|
||||||||
| 23.07.2015, 17:13 | ||||||||
А вот потому uint и не используют... Добавлено через 8 минут kolorotur, Че и даже byte не нужен? Тогда мы скатимся в Java... Я долгое время занимался разработкой статистического софта и почти везде использовал float вместо double. Почему? Потому что он в два раза меньше занимает памяти. На больших объемах данных это существенно. Без byte тоже не обойтись. Например тип Сolor содержит 4 байта, а если использовать Java-like подход - то будет все 16. Оно надо? Да, типы uint и ulong - не очень часто используются, тем не менее иногда полезны. Хотя бы для того, что бы подчеркнуть, что данное значение не может быть меньше нуля.
0
|
||||||||
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
|
|
| 23.07.2015, 17:21 | |
|
Storm23, бесконечный цикл когда попытается нулю сделать --
ну в смысле на сколько я помню, если мы без знаковому типу данных попытаемся присвоить отрицательное значение, оно превратится во что то типа 325654233124, со всеми вытекающем последствиями.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 23.07.2015, 17:28 | |||||
|
Вангую, что рано или поздно 64-битные вычисления полностью вытеснят 32-битные, как 32-битные в свое время вытеснили 16-битные.
0
|
|||||
|
|
|||
| 23.07.2015, 17:33 | |||
|
0
|
|||
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
|
|
| 23.07.2015, 18:21 | |
|
кстати, произвел замер преобразования, uint или long достаточно быстро преобразуются в int, можно сказать почти как без преобразования, а вот ulong и float чуть по хуже, но тоже разница не велика, при объеме.
0
|
|
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
| 23.07.2015, 19:17 | |
|
VLK,прежде чем забивать голову лучше задаться вопросом - а нафига?
памяти-то хватит на списки больше int.max? даже список с пустыми ссылками займет 16 гигабайт просто на самого себя, не считая данных на которые ссылки указывают на 32 битной системе он бы занял всего 8 гб, но 32 битная система не умеет в 8 гб 2 миллиарда объектов это мягко говоря дофига, даже в полноценных СУБД столько не накапливается, кроме совсем уж диких мест вроде ютуба или фейсбука где сидят десятки миллионов юзеров
1
|
|
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
|
|
| 23.07.2015, 19:25 | |
|
m0nax, у меня фобия, я всё всегда пытаюсь сделать идеально, отсюда и вытекают, такие вопросы.
0
|
|
|
8 / 8 / 3
Регистрация: 20.05.2012
Сообщений: 174
|
|||
| 23.07.2015, 22:57 [ТС] | |||
|
Благодарю за развёрнутые ответы Похоже, что мои мечты о byte'овых массивах всё же больше идеалистические, чем практические, по крайней мере в рамках C#...
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||
| 23.07.2015, 23:32 | ||||
|
Интероп — это в принципе работа с другой средой. Например, использование сишных библиотек через DllImport — это тоже интероп. Работа с офисом — тот еще интероп. Ну и так далее. Добавлено через 2 минуты Хотя бы ради унификации и упрощения, к которым видно явное стремление на протяжении всей жизни того же шарпа. А память только дешевеет.
0
|
||||
| 23.07.2015, 23:32 | |
|
Помогаю со студенческими работами здесь
20
Написать функцию типа Beaty(int iA, int iB, int *pc) Размерность int или как из signed int сделать unsigned int? Блин, для ЧЕГО НУЖНА Функция CREATE TABLE invoice( inv_id INT AUTO_INCREMENT NOT NULL , usr_id INT NOT NULL , prod_id INT NOT NULL , quantity INT NOT Составить рекурсивную функцию int DigitSum(int n) целого типа, которая находит сумму цифр целого числа n, не используя операторы цикла Напишите перегруженную функцию power (), которая принимает два целочисленных параметра типа int и возвращает целочисленное значение типа int Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|