Как объявить 32-битное целое число в java?

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

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


person Joel Coehoorn    schedule 31.10.2010    source источник
comment
Я думал, что int в Java — это 32-битный тип?!   -  person AraK    schedule 01.11.2010
comment
@AraK - возможно, это так, но я не уверен, что он не масштабируется до 64 бит в системах x64, и я не вижу окончательного ответа в документации.   -  person Joel Coehoorn    schedule 01.11.2010
comment
Точнее, я вижу его для int, но нигде нет ссылки на unsigned int.   -  person Joel Coehoorn    schedule 01.11.2010
comment
@Joel В Java нет беззнаковых типов; они опустили их, чтобы избежать путаницы   -  person Michael Mrozek    schedule 01.11.2010
comment
зачем тебе без подписи? должен может выполнять беззнаковые операторы сдвига в java для целых чисел со знаком.   -  person benmmurphy    schedule 01.11.2010
comment
Java не позволит вам думать о неподписанных. Это ошибка.   -  person tchrist    schedule 01.11.2010
comment
@Joel Coehoorn: полезная ссылка: darksleep.com/player/JavaAndUnsignedTypes.html   -  person andersoj    schedule 01.11.2010
comment
Вот что мне не нравится в этом сайте. Такие вопросы получают 9 (!!!) ответов. Люди! Что с тобой не так?   -  person Dimitris Andreou    schedule 01.11.2010
comment
@Dimitris Почему не должно на этот вопрос быть ответы? Или их много? Кнопки голосования здесь не просто так...   -  person Santa    schedule 03.11.2010
comment
@Санта, у него должен быть один ответ длиной в три символа. Все, что сверх этого, — просто шум, и весьма показательно, что программисты так склонны к такому многословию.   -  person Dimitris Andreou    schedule 04.11.2010


Ответы (11)


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

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

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

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

person paxdiablo    schedule 31.10.2010
comment
@Joel Java не имеет неподписанных - person cobbal; 01.11.2010

Int будет 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

person dmck    schedule 31.10.2010

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

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

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

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

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

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

ПОСЛЕДУЮЩИЕ

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

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

person Stephen C    schedule 31.10.2010

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

person pyCoder    schedule 31.10.2010

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

person Zecc    schedule 31.10.2010

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

person thejh    schedule 31.10.2010

«int» / «Integer» в Java не зависит от платформы. Он всегда 32-битный. Зависимый от платформы — com.sun.jna.ptr.IntByReference.

person vcsjones    schedule 31.10.2010

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

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

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

person Gintautas Miliauskas    schedule 31.10.2010

В java целые уже 32-битные. Длинные 64-битные.

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

person Slava Markeyev    schedule 31.10.2010

В java int 32-битный. Длинные 64-битные. Поэтому, если он больше 32 бит, вам нужен длинный.

person Nikhil Kumar    schedule 14.04.2015

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

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.
person Jevgenij Kononov    schedule 27.06.2016