Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
8 / 8 / 3
Регистрация: 20.05.2012
Сообщений: 174

Выбор типа для числа. Int или не Int

23.07.2015, 14:10. Показов 3118. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня форумчанам.

Я недавно начал писать на C# и меня беспокоит вопрос правильного выбора типа для числовых переменных (не считая выбор между int и double, т.к. они реализуют различный, как мне видится, функционал).

Мне не совсем понятно, почему в большинстве примеров используется int, чем это мотивируется. Только ли для простоты примера? Помнится где-то читал, что хранение памяти в 64битных системах организовано таким образом, что там выгоднее использовать int. Так ли это или я не то запомнил?

Если я задаю динамический массив или цикл for менее 255 элементов(итераций), имеет ли смысл менять привычный int на byte? (в случае массива, написать свой итератор с byte)

Имеет ли смысл делать поля ID в форматах uint/ushort(когда классов не ожидается много) для явного исключения отрицательных значений?

Я пока не ограничен по времени и хотел бы писать, по возможности, более оптимальный код, но, к сожалению, нету примеров/наставников

Подскажите, чем вы руководствуетесь при выборе типа для числовых переменных?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.07.2015, 14:10
Ответы с готовыми решениями:

Составить рекурсивную функцию int DigitSum(int n) целого типа, которая находит сумму цифр целого числа n
Составить рекурсивную функцию int DigitSum(int n) целого типа, которая находит сумму цифр целого числа n, не используя операторы цикла. :(

Какая из этих функций int Q(int w) int W(int y,int u,int i) сработает быстрее?
Если есть 2 функции(простые или перегруженные) к примеру Q(int w) int W(int y,int u,int i)или int Funkz(int a) int Funkz(int a, int b, int...

В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.?
Не понимаю, с чего начинать. Заранее спс.

19
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2015, 14:16
Лучший ответ Сообщение было отмечено Kamerton как решение

Решение

Цитата Сообщение от Kamerton Посмотреть сообщение
не совсем понятно, почему в большинстве примеров используется int, чем это мотивируется.
Производительностью и понятностью синтаксиса.
В большинстве случаев все типы, меньшие, чем int, при арифметических или побитовых операциях все равно будут увеличены до инта, так что можно не запариваться.

Цитата Сообщение от Kamerton Посмотреть сообщение
Если я задаю динамический массив или цикл for менее 255 элементов(итераций), имеет ли смысл менять привычный int на byte?
Нет, если не работаете с интеропом.

Цитата Сообщение от Kamerton Посмотреть сообщение
Имеет ли смысл делать поля ID в форматах uint/ushort(когда классов не ожидается много) для явного исключения отрицательных значений?
Нет, если не работаете с интеропом.

Цитата Сообщение от Kamerton Посмотреть сообщение
чем вы руководствуетесь при выборе типа для числовых переменных?
Целое исло — int, большое целое число — long.
Вещественное число для вычислений вроде физических — double.
Вещественное число для вычисления финансов — decimal.
Интероп, требующий беззнаковых чисел — ushort, uint, ulong.
Прочий интероп — byte, short, int, long.
Работа с данными вроде файловых или сетевых — byte.
3
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
23.07.2015, 14:20
Цитата Сообщение от Kamerton Посмотреть сообщение
Мне не совсем понятно, почему в большинстве примеров используется int, чем это мотивируется
С точки зрения быстродействия процессора, манипуляции с 1 байтом, с 2 байтами и с 4 байтами - одинаково по скорости (поскольку процессор все равно оперирует 32 разрядными регистрами). Поэтому нет особого смысла использовать 1 или 2 байтовые локальные переменные. Ни памяти ни скорости вы от этого не выиграете.
Кроме того, многие функции заточены именно под int. Например функции из Math. Или, например если вы обращаетесь к элементу массива, то в качестве индекса обычно принимается int. Если же у вас будет иной тип, то он будет преобразовываться к int. А это лишние операции.

Другие дело хранение объектов в памяти. Если число явно не может быть отрицательным, то лучше конечно хранить в беззнаковом виде.

Имеет ли смысл делать поля ID в форматах uint/ushort(когда классов не ожидается много) для явного исключения отрицательных значений?
Имеет. С точки зрения сохранения целостности данных.
2
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.07.2015, 14:20
Цитата Сообщение от Kamerton Посмотреть сообщение
чем вы руководствуетесь при выборе типа для числовых переменных?
Наверное, удобством. Тип Int32 самый удобный. Он может вместить достаточно большое целое число, а Int64 только при необходимости.
Так же, надо учитывать, что при любых арифметических операциях более низкие целые (byte, short) неявно приводятся к Int32, и в таких случаях требуется явное приведение типов, что неудобно.
Что касается знаковых-беззнаковых целых, тут все зависит от задачи, которую вы решаете.
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
23.07.2015, 15:14
Цитата Сообщение от Storm23 Посмотреть сообщение
Если же у вас будет иной тип, то он будет преобразовываться к int. А это лишние операции.
преобразование типа накладная операция?

Как быть, когда допустим стандартный класс List (ну или другие классы из библиотеки) использует int в качестве индекса, а длинна у меня должна быть больше, чем вмещает int, можно как то решить эту проблему или надо свой список делать?

PS давно меня мучают эти вопрос с типами, но вот все ни как повода не было спросить.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.07.2015, 15:29
Цитата Сообщение от VLK Посмотреть сообщение
можно как то решить эту проблему или надо свой список делать?
А разве Generic (LIst<T>) отменили?
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
23.07.2015, 15:45
insite2012, может я что то не так понял, я имею ввиду я создаю список строк:
C#
1
List<string> list = new List<string>();
и элементов в этом списке будет больше, чем вмещает int, как мне тогда обращаться к элементам этого списка:
C#
1
list[100000000000];
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.07.2015, 15:55
Цитата Сообщение от VLK Посмотреть сообщение
как мне тогда обращаться к элементам этого списка
Ааа, вот вы про что... Ну в самом простом случае - взять исходники, к примеру, List<T> и переписать с другим основанием (long, к примеру).
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.07.2015, 16:30
VLK,
This would not be useful if it was allowed. The CLR has a limit on the maximum size of an object at 2GB. Hence it's not even possible to construct an array where a long index would be useful.
Объекты больше 2гб (включая х64) можно строить только начиная с .Net 4.5

Добавлено через 6 минут
Тем более ничего хорошего из этого всё равно не выйдет. Т.к. интерфейсы IList<T>, IReadOnlyList<T>, сам список, все свойства (Count, Size) имеют тип int. В результате нужно переписывать полностью весь неймспейс System.Collections.Generics для работы с лонгами.

Добавлено через 1 минуту
Так что даже если взять исходники - нужно будет писать класс, с которым нельзя будет нормально работать через интерфейсы (все элементы после первых двух миллиардов будут недоступны).
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
23.07.2015, 16:47
insite2012, Psilon, понятно, у меня бывает появляется какой то вопрос (не к селу не к городу) и вот не успокоюсь, пока не получу ответ.
Мне вот интересно, а почему изначально все эти List и т.д. не используют uint, вроде как отрицательный индекс быть не может.

ну или может, что то я такое припоминаю, вот только лучше обойтись без отрицательных, но за то в 2 раза больше, чем вмещает при использовании int.

И еще, что бы не переделывать под long, можно сделать класс обертку, в который засунуть несколько списков и от этого отталкиваться, от индекса вычитать / прибавлять, столько, сколько первый вмещает список, что бы рыться во втором списке, как то так.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2015, 16:52
Цитата Сообщение от VLK Посмотреть сообщение
почему изначально все эти List и т.д. не используют uint
Со слов Липперта, все эти uint, short и прочие sbyte в язык добавили только для того, чтобы имелась возможность взаимодействовать с другими языками, имеющими эти типы.
Если бы не это, то в шарпе было бы четыре числовых типа: int, long, double, decimal.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
23.07.2015, 17:13
Цитата Сообщение от VLK Посмотреть сообщение
Мне вот интересно, а почему изначально все эти List и т.д. не используют uint, вроде как отрицательный индекс быть не может.
А вот пример:
C#
1
2
3
            var array = new int[10];
            for (uint i = 9; i>=0;i--)
                Console.WriteLine(array[i]);
Можете навскидку сказать, что будет при выполнении этого кода?
А вот потому uint и не используют...

Добавлено через 8 минут
kolorotur, Че и даже byte не нужен? Тогда мы скатимся в Java...
Цитата Сообщение от kolorotur Посмотреть сообщение
Вещественное число для вычислений вроде физических — double.
Как то у вас все сильно упрощено. Например вся графика (как 3D так и 2D) использует float а не double.
Я долгое время занимался разработкой статистического софта и почти везде использовал float вместо double. Почему? Потому что он в два раза меньше занимает памяти. На больших объемах данных это существенно.
Без byte тоже не обойтись. Например тип Сolor содержит 4 байта, а если использовать Java-like подход - то будет все 16. Оно надо?
Да, типы uint и ulong - не очень часто используются, тем не менее иногда полезны. Хотя бы для того, что бы подчеркнуть, что данное значение не может быть меньше нуля.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
23.07.2015, 17:21
Storm23, бесконечный цикл когда попытается нулю сделать --

ну в смысле на сколько я помню, если мы без знаковому типу данных попытаемся присвоить отрицательное значение, оно превратится во что то типа 325654233124, со всеми вытекающем последствиями.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2015, 17:28
Цитата Сообщение от Storm23 Посмотреть сообщение
Че и даже byte не нужен?
Цитата Сообщение от kolorotur Посмотреть сообщение
Работа с данными вроде файловых или сетевых — byte.



Цитата Сообщение от Storm23 Посмотреть сообщение
Например вся графика (как 3D так и 2D) использует float а не double.
Legacy + заточенная под нее архитектура.
Вангую, что рано или поздно 64-битные вычисления полностью вытеснят 32-битные, как 32-битные в свое время вытеснили 16-битные.

Цитата Сообщение от Storm23 Посмотреть сообщение
Как то у вас все сильно упрощено.
Да я в принципе люблю когда все просто
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
23.07.2015, 17:33
Цитата Сообщение от kolorotur Посмотреть сообщение
Legacy + заточенная под нее архитектура.
Неа, это не legacy. Просто в графике не нужна точность double. А вот двойной объем памяти под double - пустая трата ресурсов.
Цитата Сообщение от kolorotur Посмотреть сообщение
Вангую, что рано или поздно 64-битные вычисления полностью вытеснят 32-битные, как 32-битные в свое время вытеснили 16-битные.
А зачем вытеснять 32 битный int, если он подходит для подавляющего числа рссчетов?
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
23.07.2015, 18:21
кстати, произвел замер преобразования, uint или long достаточно быстро преобразуются в int, можно сказать почти как без преобразования, а вот ulong и float чуть по хуже, но тоже разница не велика, при объеме.
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
23.07.2015, 19:17
VLK,прежде чем забивать голову лучше задаться вопросом - а нафига?
памяти-то хватит на списки больше int.max? даже список с пустыми ссылками займет 16 гигабайт просто на самого себя, не считая данных на которые ссылки указывают
на 32 битной системе он бы занял всего 8 гб, но 32 битная система не умеет в 8 гб
2 миллиарда объектов это мягко говоря дофига, даже в полноценных СУБД столько не накапливается, кроме совсем уж диких мест вроде ютуба или фейсбука где сидят десятки миллионов юзеров
1
 Аватар для VLK
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  [ТС]
Цитата Сообщение от VLK Посмотреть сообщение
у меня фобия, я всё всегда пытаюсь сделать идеально, отсюда и вытекают, такие вопросы.
Вот-вот-вот... (с) И у меня также... И не поймёшь, то ли лечиться, то ли в QA развиваться...

Благодарю за развёрнутые ответы Похоже, что мои мечты о byte'овых массивах всё же больше идеалистические, чем практические, по крайней мере в рамках C#...

Цитата Сообщение от kolorotur Посмотреть сообщение
Нет, если не работаете с интеропом.
А можете чуть подробнее, пожалуйста... Интероп - это ведь COM? А то COM Interop на msdn меня смущает... Какое понятие больше: COM, Interop или они эквивалентны?)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2015, 23:32
Цитата Сообщение от Kamerton Посмотреть сообщение
Интероп - это ведь COM?
И СОМ в том числе.
Интероп — это в принципе работа с другой средой. Например, использование сишных библиотек через DllImport — это тоже интероп.
Работа с офисом — тот еще интероп.
Ну и так далее.

Добавлено через 2 минуты
Цитата Сообщение от Storm23 Посмотреть сообщение
Просто в графике не нужна точность double. А вот двойной объем памяти под double - пустая трата ресурсов.
Цитата Сообщение от Storm23 Посмотреть сообщение
А зачем вытеснять 32 битный int, если он подходит для подавляющего числа рссчетов?
Возразить мне вам нечем, но все равно имеется уверенность в том, что 64-битные вычисления вытеснят 32-битные.
Хотя бы ради унификации и упрощения, к которым видно явное стремление на протяжении всей жизни того же шарпа.
А память только дешевеет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.07.2015, 23:32
Помогаю со студенческими работами здесь

Написать функцию типа Beaty(int iA, int iB, int *pc)
Задание: Написать функцию типа Beaty(int iA, int iB, int *pc); для выражения (iA+iB)/(iA*iB). Помогите решить!

Размерность 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
Погуглив, так и не смог толком понять. Есть тут ГУРУ по mysql Которые могут на пальцах или на примере показать для чего она нужна. ...

Составить рекурсивную функцию int DigitSum(int n) целого типа, которая находит сумму цифр целого числа n, не используя операторы цикла
Составить рекурсивную функцию int DigitSum(int n) целого типа, которая находит сумму цифр целого числа n, не используя операторы цикла.

Напишите перегруженную функцию power (), которая принимает два целочисленных параметра типа int и возвращает целочисленное значение типа int
Операции над целыми числами осуществляются быстрее, чем над числами с плавающей точкой. Напишите перегруженную функцию power (), ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Реалии
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
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru