Как мне объявить 32-битное целое число в Java? - PullRequest
6 голосов
/ 01 ноября 2010

Я смотрю на приложение на Java, которое работает как на 32-битных, так и на 64-битных системах, и оно работает в основном с IP-адресами. Эти IP-адреса хранятся в виде целых чисел, и нормальный тип для этого тратит тонну памяти на 64-битных платформах (и да, использование памяти уже было проблемой здесь). Как вы объявляете 32-битные интегральные значения, которые остаются на 32-битных даже на архитектурах x64?

Поскольку я новичок в Java, если есть встроенный тип, который уже предназначен для обработки IP-адресов, пожалуйста, не стесняйтесь указывать мне на это;)

Ответы [ 11 ]

27 голосов
/ 01 ноября 2010

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

Целочисленными типами являются byte, short, int и long, значения которых являются соответственно 8-разрядными, 16-разрядными, 32-разрядными и 64-разрядными целыми числами с двумя дополнительными числами со знаком и char, значения которого являются 16-разрядными целые числа без знака, представляющие кодовые единицы UTF-16.

Возможно, это связано с множеством проблем переносимости, обнаруженных в C с различными значениями ширины (и даже кодировкой, например, дополнением к двум, дополнением к одному и знаком / величиной), которых Java надеялась избежать, тем более что она должна была выполняться на как можно большем количестве различных платформ.

Что касается встроенного типа для обработки IP-адресов, в Java есть Inet4Address и Inet6Address , в зависимости от ваших потребностей (и их общего предка, InetAddress ). * * тысяча двадцать-один

8 голосов
/ 01 ноября 2010

Интеллект будет 32-битным даже на 64-битных машинах, вам ничего не нужно делать.

Из спецификации языка Java (http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)

Тип данных int - это 32-разрядное целое число со знаком в виде двоичного числа со знаком. Он имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647 (включительно). Для целочисленных значений этот тип данных обычно является выбором по умолчанию. Этот тип данных, скорее всего, будет достаточно большим для чисел, которые будет использовать ваша программа, но если вам нужен более широкий диапазон значений, используйте вместо него long.

Основное различие между 32-битными и 64-битными виртуальными машинами Java - это максимальный размер кучи, то есть объем памяти, которой может управлять виртуальная машина.

Однако внутренняя реализация 64-битных виртуальных машин будет влиять на использование памяти:

Как правило, преимущества возможности адресовать большие объемы памяти приводят к небольшой потере производительности в 64-разрядных виртуальных машинах по сравнению с запуском того же приложения на 32-разрядной виртуальной машине. Это связано с тем, что каждый собственный указатель в системе занимает 8 байтов вместо 4. Загрузка этих дополнительных данных влияет на использование памяти, что приводит к немного более медленному выполнению в зависимости от того, сколько указателей загружено во время выполнения. ваша программа на Java.

От: http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_description

3 голосов
/ 01 ноября 2010

Используйте тип примитива int.Это 32 бит на всех платформах Java;см. JLS 4.2.1 .

, и да, использование памяти уже было проблемой здесь

Хорошо, если вы так говорите.

Мы не знаем, что вы здесь делаете.Но если вас беспокоит использование памяти при представлении огромного количества IP-адресов в памяти, то, возможно, вам необходимо:

  • не сохранять IP-адреса в памяти,
  • увеличитьРазмер кучи Java или
  • (при необходимости) увеличит размер вашего оборудования или операционной системы.

Или, может быть, вы только что получили "потерю" памяти из-за несоразмерности.По своей природе Java жаждет памяти, и прагматичный ответ - дать ей то, что она хочет.

СЛЕДУЙТЕ ЗА

Java не имеет беззнакового типа int.Но вам не нужно это представлять IP-адреса, не в последнюю очередь потому, что вам не нужно делать арифметику с ними.

(И даже если вы это сделали, есть способы сделать это. Имейте в виду, что если вы хотите выжать последнюю унцию «потери» памяти из Java-приложения, вам нужно будет сделатьнекоторые ужасные вещи.)

2 голосов
/ 01 ноября 2010

int примитивный тип Java имеет фиксированный размер 32 бит

1 голос
/ 01 ноября 2010

int - 32 бит на каждой платформе. Однако, чтобы сделать это без знака, вам нужно вручную сдвигать числа и тому подобное - это действительно становится сложным. Почему бы не использовать байт [] или длинный?

1 голос
/ 01 ноября 2010

Не волнуйтесь, тип int в Java определен (в отличие от C / C ++) точно 32-битным, как упоминалось здесь .

0 голосов
/ 27 июня 2016

Лучший способ сделать это - импортировать новые библиотеки

import java.lang.Object;
import java.lang.Number;
import java.lang.Integer;
You should import these libraries, this will give you a new max values.
0 голосов
/ 14 апреля 2015

В Java это 32-битный. Длинные 64-битные. Так что если значение больше 32 бит, вам нужен long.

0 голосов
/ 01 ноября 2010

В Java-int уже 32 бит.Длинные 64-битные.

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

0 голосов
/ 01 ноября 2010

С http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html:

Целыми типами являются байты, короткие, int и long, значения которых 8-битные, 16-битные, 32-битные и 64-битные подписанные целые числа с двумя дополнительными числами, соответственно и char, значения которых 16-разрядные целые числа без знака представляющие символы Юникода.

Так что int уже 32-битный по определению, хотя интерпретатор мог бы поместить его на 64-битную границу в памяти, чтобы ускорить доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...