2014-10-16 4 views
32

Часто возникающие вопросы относительно Overflow ошибок с .Зачем использовать Integer вместо Long?

Мой вопрос: зачем использовать объявление переменной integer вместо простого определения всех числовых переменных (исключая double и т. Д.) Как long?

Если вы не выполняете операцию, как в цикле for, где вы можете гарантировать, что значение не превысит предел 32 767, есть ли влияние на производительность или что-то еще, что не диктует использование long?

+3

Вы спрашивали себя, почему существуют разные типы данных (* числовые *)? –

ответ

83

Целочисленных переменные хранятся в виде 16-битных (2 байта) чисел

msdn

Long (длинное целое) переменные хранятся в виде 32-разрядных (4 байта номера

msdn

)

Итак, преимущество в сокращении объема памяти. Целое число занимает половину памяти, которая длится долго. Теперь мы говорим о 2 байтах, так что это не изменится, если вы не храните TON целых чисел.

НО на битной системе , 16-битное целое получает молча преобразуется в длинный без использования большего диапазона чисел для работы с. Переполнение все еще происходит, и требуется столько же памяти. Performance may even be hurt, потому что тип данных должен быть преобразован (на очень низком уровне).

Не ссылка, которую я искал, но ....

Я понимаю, что базовый движок VB преобразует целые числа в длинные, даже если объявлен как целое. Поэтому можно отметить небольшое снижение скорости. Я верил в это какое-то время и, возможно, это также объясняется тем, что было сделано выше, я не просил рассуждать.

ozgrid forums

Это ссылка, которую я искал.

Короткий ответ в 32-битных системах 2 байтовых целых числа преобразуются в 4 байт Длинны. Нет никакого другого способа, чтобы соответствующие биты правильно линии для любой формы обработки. Рассмотрим следующий

MsgBox Hex(-1) = Hex(65535) ' = True 

Очевидно -1 не равна 65535 пока компьютер возвращает правильный ответ, а именно «FFFF» = «FFFF»

Однако если бы мы принуждены -1 к длинному первых, мы получили бы правильный ответ (65535 быть больше, чем 32k автоматически длинный)

MsgBox Hex(-1&) = Hex(65535) ' = False 

"FFFFFFFF" = "FFFF"

Как правило, в VBA нет смысла объявлять «как целое» в современных системах , за исключением, возможно, для некоторых устаревших API, которые ожидают получить целое число .

pcreview forum

И наконец я нашел msdn documentation я действительно действительно искал.

Традиционно программисты VBA использовали целые числа для хранения небольших номеров , потому что им требовалось меньше памяти. Однако в последних версиях VBA преобразует все целочисленные значения в тип Long, даже если они являются , объявленными как тип Integer. Таким образом, для использования переменных Integer больше нет преимущества производительности ; Фактически, длинные переменные могут быть немного быстрее, потому что VBA не нужно их преобразовывать.

Таким образом, в настоящее время почти нет веской причины использовать тип Integer. Если, вам нужно взаимодействовать со старым вызовом API, который ожидает 16-битный int.

Одна вещь стоит отметить, что некоторые старые функции API могут ожидать параметры, которые являются 16-битными (2 байта) Целые и если вы на 32 бита и пытается передать Integer (то есть уже 4-байтовый) по ссылке, он не будет работать из-за разницы в длине байтов.

Благодаря Vba4All для указания этого.

+4

Следует отметить, что некоторые старые функции API могут ожидать параметры, которые являются 16-разрядными (2-байтовыми) целыми числами, и если вы находитесь на 32-битном и пытаетесь передать Integer (это уже 4-байтовый длинный) по ссылке он не будет работать из-за разницы в длине байтов. –

+2

@ Это ярость. Я не понимаю. Если вы передадите Long по ссылке на функцию, которая ожидает Integer по ref, она будет использовать первые два байта, а так как числа хранятся в little-endian, это будет работать (при условии, что только два нижних байта имеют смысл, но вероятно, если этот Long - это просто целое число, хранящееся в 32 битах). –

+2

В то время, когда вы * должны * использовать 'Integer', это когда объявляется' Type', где макет и размер типа важны либо потому, что вы передаете тип API, либо сериализуете/десериализируете файл, или вы копируете байты с 'LSet' /' Rset'. – ThunderFrame

-6

Возможно, CS-град может объяснить это лучше, но да целому числу требуется меньше памяти для хранения (возможно, это не относится к очень простому сценарию VBA).

Он также гарантирует/подтверждает, что переменная всегда будет целочисленной (не десятичной). Я уверен, что если вы сохраните 6.7 как целое число, оно будет преобразовано в число 7 в VBA.

Возможно, это не самая лучшая практика, но могут быть случаи, когда это необходимо. Я считаю, что главная цель - проверка достоверности данных. В частности, да, для циклов, где что-то должно произойти Х количество раз - десятичное значение не имеет смысла.

Первичное различие - память, хотя - если я помню длинный бит 64 бит, а целое число равно 32 бит.

+2

Это пространство памяти .Net, а не VBA. – RubberDuck

7

У VBA много исторических багажа.

Integer имеет ширину 16 бит и был хорошим цифровым типом по умолчанию, когда преобладали 16-битовые архитектуры/размеры слов.

A Long имеет ширину в 32 бита и (IMO) следует использовать везде, где это возможно.

9

Как отмечено в других ответах, реальная разница между int и long - это размер его пространства памяти и, следовательно, размер номера, который он может удерживать.

здесь является полная документация на эти типы данных http://msdn.microsoft.com/en-us/library/office/ms474284(v=office.14).aspx

Integer 16 битов и может представлять значения между -32768 и 32768

Long 32 бита и может представлять - 2,147,483,648 до 2,147,483,648

и есть LongLong который имеет 64 бита и может обрабатывать как 9 pentilion

Одна из самых важных вещей, которые следует помнить об этом, состоит в том, что типы данных различаются как языком, так и операционной системой/платформой. В вашем мире VBA длинное 32 бита, но в C# на 64-битном процессоре длинное 64 бит. Это может привести к значительной путанице.

Хотя VBA не имеет поддержки для этого, при переходе на любой другой язык в .net или Java или другой, я предпочитаю использовать системные типы данных int16, int32 и int64, который позволяет я более прозрачен в отношении значений, которые могут храниться в этих типах данных.

4

Это space vs необходимо проблема.

В некоторых ситуациях это необходимо необходимости использовать длинный. Если вы перебираете строки в большом файле excel, переменная, содержащая номер строки, должна быть длинной.

Однако иногда вы узнаете, что целое число может справиться с вашей проблемой, и использование длинной будет пустой тратой пространства (память). Отдельные переменные действительно не имеют большого значения, но когда вы начинаете разбираться с массивами, это может иметь большое значение.

  • В VBA7, Целые 2 байта и тоскует являются 4 байта

  • Если у вас есть массив 1 миллиона чисел от 1 до 10, используя массив Integer бы до о 2 Мб RAM, по сравнению с примерно 4 МБ ОЗУ для длинного массива.

+0

Для массива чисел от 1 до 10 вы можете использовать массив BYTE, но я понимаю, что вы делаете. – ChrisB

Смежные вопросы