Подтвердить что ты не робот

Будет ли работа с длинными целями работать на 32-битной системе?

Если я правильно понимаю, что int-variable сохраняет в 32 бит, ограничивая его на -2 миллиарда до 2 миллиардов. Однако, если я использую длинную переменную, она сохранит в 64 бит, что позволит хранить намного больше номеров. Я сижу на 64-битной системе, но будет ли мой код работать на 32-разрядной системе, если я храню данные в 64-битной версии?

Спасибо!

4b9b3361

Ответ 1

Не волнуйся об этом. Значение long будет сохранено в 2 адресах памяти. Int64/long всегда будет 64 бит, а Int32/int всегда будет 32 бит.

Есть несколько последствий (в отношении объема памяти и производительности), но наиболее заметным может быть то, что операции записи/чтения не будут атомарными в 32-битных системах, но вы не должны ожидать, что они будут атомарными в любом случае, поскольку Спецификация С# не дает такой гарантии.

В любом случае, дело в том, что это не то, о чем вам следует беспокоиться - CLR абстрактно отводит это. Используйте любой тип, который вам подходит.

Ответ 2

В 32-битной системе операции с 32-битным целым могут выполняться в одном машинном регистре. Но операции с 64-битным целым требуют двух машинных регистров и довольно немного менее эффективны, чем 32-разрядные операции. И, конечно, в два раза больше long использует больше памяти, чем int. Если у вас есть массивы этих типов, вы будете использовать свой кеш в два раза быстрее, если используете long. Это может также иметь последствия для производительности.

Итак, если вы можете использовать int, вы должны предпочесть его long. Однако, если 32 бита диапазона, предоставленного int, недостаточны для правильности вашей программы, вам нужно будет использовать long.

Конечно, хотя операции с 64-битными целыми числами менее эффективны при работе на 32-битной машине, только профилирование скажет вам, действительно ли это имеет значение.

Возможно, суть в том, что программисты не должны умышленно расточать. Зачем использовать 64 бита, если достаточно 32 бит?

Ответ 3

Да. Тип данных поддерживается для обоих. Но 64-битное целое не является родным для 32-разрядных процессоров. Если вы используете 64-битный тип и компилируете только для 64-битных (вы можете выбрать x64 или x86 (= 32 бит) в качестве целевого объекта), тогда компилятор может использовать определенные 64-битные инструкции, что делает ваше приложение немного быстрее. Теоретически, то есть на практике вы, вероятно, не заметите этого.

Компромисс заключается в том, что это приложение не будет работать на 32-битной платформе. Будет наоборот. Поэтому, если вы планируете нацеливаться на обе платформы, вам нужно либо скомпилировать только до 32 бит, либо скомпилировать два раза один раз для каждой платформы.

Для доступности типа long это не имеет значения. Вы всегда можете использовать его.

Ответ 4

Вы можете попробовать себя следующим образом:

Console.WriteLine(sizeof(long));

Затем скомпилируйте его как x86 вместо AnyCPU и запустите его. Вы также можете запускать 32-разрядные программы на 64-битной Windows - посмотрите, какой результат.

Существуют даже более крупные типы номеров, такие как BigInteger, и они также работают с 32- и 64-разрядными операционными системами.