2016-06-16 2 views
0

Всем это известно, int меньше, чем long.int limit vs long limit

За this MSDN link, я читаю следующее:

INT_MIN (Minimum value for a variable of type int.) –2147483648 
INT_MAX (Maximum value for a variable of type int.)  2147483647 

LONG_MIN (Minimum value for a variable of type long.) –2147483648 
LONG_MAX (Maximum value for a variable of type long.) 2147483647 

Та же информация может быть найдена here.

Неужели мне рассказали ложь всю свою жизнь? В чем разница между int и long, если нет значений, которые они могут удерживать? Как так?

+1

Оба эти ограничения относятся к C++, а не к C# –

+0

Это C++, а не C#, см. Хлебные кусочки на этой странице: '... Язык C++> Основные сведения о ссылке> Численные ограничения –

+0

См. Https://msdn.microsoft .com/en-us/library/5kzh1b5w.aspx и https://msdn.microsoft.com/en-us/library/ctetwysk.aspx для C# –

ответ

1

Вы упоминали как C++ и ASP.NET. Эти два очень разные.

Что касается спецификаций C и C++, единственное, что вы знаете о примитивном типе данных - это максимальный диапазон значений, которые он может хранить. Подготовьтесь к первому удивлению - int соответствует диапазону [-32767; 32767]. Большинство людей сегодня думают, что int - это 32-битное число, но на самом деле гарантируется возможность хранить эквивалант 16-битного номера почти. Также обратите внимание, что диапазон не является более типичным [-32768; 32767], поскольку C был разработан как общая абстрактная машина для широкого спектра платформ, включая платформы, которые не использовали дополнение 2 для своих отрицательных чисел.

Поэтому не следует удивляться, что long на самом деле является типом данных типа «сортировка 32-бит». Это не означает, что реализации C++ в Linux (которые обычно используют 64-разрядное число для long) ошибочны, но это означает, что приложения на C++, написанные для Linux, которые предполагают, что long - это 64-разрядные , являются неправильными. Это очень весело при переносе приложений на C++ в Windows, конечно.

Стандартный 64-битовый целочисленный тип для использования - long long, и это стандартный способ объявить 64-битное целое число в Windows.

Тем не менее, .NET не заботится о таких вещах, поскольку он построен с нуля по своей собственной спецификации - отчасти именно из-за того, что с C и C++ связаны с историей. В .NET int представляет собой 32-разрядное целое число, а long - это 64-разрядное целое число, а long - всегда больше, чем int. В C, если вы использовали long (32-bittish) и сохранили значение, равное десяти триллионам там, был шанс, что он сработает, так как возможно, что ваш long был фактически 64-битным номером, а C не заботился о различии - это именно то, что происходит на большинстве компиляторов Linux C и C++. Поскольку типы определены таким образом по соображениям производительности, для компилятора совершенно законно использовать 32-битный тип данных для хранения 8-битного значения (помните об этом, когда вы «оптимизируете производительность» - компилятор самостоятельно делая свои оптимизации). ,NET может все еще работать на платформах, которые не имеют, например, 32-разрядные целые числа дополнений, но среда выполнения должна гарантировать, что тип может содержать столько же, сколько целое число до 32 бит, даже если это означает, что требуется следующий более крупный тип («тратя в два раза больше памяти»).

+0

на 32-разрядной Linux 'long' также 32 бит –

+0

@ LưuVĩnhPhúc Это в конечном счете зависит от компилятор - я не уверен, какие компиляторы делают это, каким образом, но весь код Linux, с которым я работал с предполагаемым 'long', может содержать 64-битное значение (в 64-битной ОС и ЦП,). – Luaan

1

Это

C++ Во многих (но не всех) реализаций C и C++, давно больше, чем Int. Сегодняшние самые популярные настольные платформы, такие как Windows и Linux, работают в основном на 32-битных процессорах, и большинство компиляторов для этих платформ используют 32-битный int, который имеет одинаковый размер и представление как длинный.

См реф http://tsemba.org/c/inttypes.html

1

В C и C++ требования являются, что int может содержать по меньшей мере, 16 бит, long может содержать по меньшей мере, 32 бита, и int не может быть больше, чем long. Нет требования, чтобы int был меньше, чем long, хотя компиляторы часто реализуют их таким образом. Тебе не сказали лжи, но тебе сказали упрощение.

+0

Да, между «ложью» и «упрощением» есть тонкая грань. Умные люди лгут путем упрощения: P – Luaan

1

Нет! Хорошо! С детства нам говорили, что солнце восходит на востоке и заходит на запад. (Солнце не движется в конце концов!)
В более ранних средах обработки, где у нас было 16-разрядных операционных систем, целое число считалось равным 16 битам (2 байта), а «длинный» как 4 байта (32 бита)

Но, с появлением 32 бит и 64 бит ОС, целое число, как говорят, состоит из 32 бит (4 байта) и долго, чтобы быть "по крайней мере, как большой как целое ', следовательно, 32 бит снова. Тем самым объясняется равенство между максимальным и минимальным диапазонами «int» и «long».

Следовательно, это полностью зависит от архитектуры вашей системы.