Вы упоминали как 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 бит, даже если это означает, что требуется следующий более крупный тип («тратя в два раза больше памяти»).
Оба эти ограничения относятся к C++, а не к C# –
Это C++, а не C#, см. Хлебные кусочки на этой странице: '... Язык C++> Основные сведения о ссылке> Численные ограничения –
См. Https://msdn.microsoft .com/en-us/library/5kzh1b5w.aspx и https://msdn.microsoft.com/en-us/library/ctetwysk.aspx для C# –