Я смотрю на приложение в java, которое работает как в 32-битных, так и в 64-битных системах, и оно работает в основном с IP-адресами. Эти IP-адреса хранятся как целые числа, и нормальный тип для этого тратит впустую тонну памяти на 64-битных платформах (и да, использование памяти уже было показано здесь как проблема). Как вы объявляете 32-битные целочисленные значения, которые остаются 32-битными даже на архитектурах x64?
Поскольку я новичок в Java, если есть встроенный тип, который уже предназначен для обработки IP-адресов, пожалуйста, не стесняйтесь указывать мне на это;)
Я думал, что int в Java - это 32-битный тип?! AraK 01.11.2010
@AraK - возможно, это так, но я не уверен, что он не масштабируется до 64 бит в системах x64, и я не вижу окончательного ответа в документации. Joel Coehoorn 01.11.2010
Точнее, я вижу его для int, но нигде нет ссылки на unsigned int. Joel Coehoorn 01.11.2010
@Joel В Java нет беззнаковых типов; они опустили их, чтобы избежать путаницы Michael Mrozek 01.11.2010
зачем тебе без подписи? должен может выполнять беззнаковые операторы сдвига в java для целых чисел со знаком. benmmurphy 01.11.2010
Java не позволит вам думать о неподписанных. Это ошибка. tchrist 01.11.2010
Java имеет определенную ширину для своих типов данных для переносимости. Целые числа имеют ширину 32 бита даже на 64-битных платформах. В спецификации языка Java указано совершенно ясно (слегка перефразировано, чтобы сделать его более читабельным, на мой взгляд):
Целочисленными типами являются byte, short, int и long, значения которых представляют собой соответственно 8-битные, 16-битные, 32-битные и 64-битные целые числа в дополнении до двух со знаком, и char, значения которых представляют собой 16-битные целые числа без знака, представляющие Кодовые единицы UTF-16.
Возможно, это связано со многими проблемами переносимости, обнаруженными в C с различной шириной (и даже кодировками, такими как дополнение до двух, дополнение до единицы и знак/величина) целых чисел, которых Java надеялась избежать, тем более что она предназначалась для работы на как можно большем количестве насколько это возможно на разных платформах.
Что касается встроенного типа для обработки IP-адресов, в Java есть оба Inet4Address и Inet6Address , в зависимости от ваших потребностей (и их общего предка, InetAddress).
Ответ 2 · рейтинг 10 · dmck
Int будет 32-битным даже на 64-битных машинах, вам не нужно ничего делать.
Тип данных int представляет собой 32-разрядное целое число в дополнении до двух со знаком. Он имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647 (включительно). Для целочисленных значений этот тип данных обычно используется по умолчанию. Этот тип данных, скорее всего, будет достаточно большим для чисел, которые будет использовать ваша программа, но если вам нужен более широкий диапазон значений, вместо этого используйте long.
Основное различие между 32-битными и 64-битными виртуальными машинами Java заключается в максимальном размере кучи, то есть в объеме памяти, которым может управлять виртуальная машина.
Однако внутренняя реализация 64-битных виртуальных машин повлияет на использование памяти:
Как правило, преимущества возможности адресации больших объемов памяти связаны с небольшой потерей производительности на 64-разрядных ВМ по сравнению с запуском того же приложения на 32-разрядной ВМ. Это связано с тем, что каждый собственный указатель в системе занимает 8 байтов вместо 4. Загрузка этих дополнительных данных влияет на использование памяти, что приводит к немного более медленному выполнению в зависимости от того, сколько указателей загружается во время выполнения. вашу Java-программу.
Используйте примитивный тип int. Он 32-битный на всех платформах Java; см. JLS 4.2.1.
и да, использование памяти уже было показано здесь как проблема
Хорошо, если ты так говоришь.
Мы не знаем, что вы здесь делаете. Но если вас беспокоит использование памяти при представлении огромного количества IP-адресов в памяти, возможно, вам нужно:
не хранить IP-адреса в памяти,
увеличьте размер кучи Java или
(при необходимости) увеличьте размер своего оборудования или операционной системы.
Или, может быть, вы просто получили непропорциональное "расходование" памяти. Java по своей природе требовательна к памяти, и прагматичный ответ состоит в том, чтобы позволить ему иметь то, что он хочет.
ПОСЛЕДУЮЩИЕ
В Java нет беззнакового типа int. Но вам не нужно это для представления IP-адресов, не в последнюю очередь потому, что вам не нужно выполнять с ними арифметические операции.
(И даже если бы вы это сделали, есть способы сделать это. Имейте в виду, что если вы хотите выжать последнюю унцию "потеря" памяти из Java-приложения, вам придется сделать некоторые уродливые вещи.)
Ответ 4 · рейтинг 3 · pyCoder
int примитивный тип Java имеет фиксированный размер 32 бита
Ответ 5 · рейтинг 1 · Zecc
Не волнуйтесь, тип int в Java определен (в отличие от C/C++) как 32-разрядный, как уже упоминалось здесь.
Ответ 6 · рейтинг 1 · thejh
int является 32-битным на каждой платформе. Однако, чтобы сделать его беззнаковым, вам нужно вручную сдвинуть числа и тому подобное - это действительно усложняется. Почему бы не использовать byte[] или long?
Ответ 7 · vcsjones
"int" / "Integer" в Java не зависит от платформы. Он всегда 32-битный. Зависимый от платформы - com.sun.jna.ptr.IntByReference.
Интегральные типы: byte, short, int и long, значения которых представляют собой 8-битные, 16-битные, 32-битные и 64-битные целые числа в дополнении до двух со знаком, соответственно, и char, значения которых представляют собой 16-битные целые числа без знака. представляющие символы Unicode.
Таким образом, int уже является 32-битным по определению, хотя интерпретатор может поместить его в 64-битную границу в памяти, чтобы ускорить доступ.