Сообщение длиной 10240 символов занимает в памяти 5 кбайт. Найдите степень алфавита, который

Обновлено: 21.11.2024

Ваш персональный компьютер представляет собой тип цифрового электронного компьютера. Он называется цифровым, потому что вся информация внутри него представлена ​​и обрабатывается в виде чисел (первоначальное значение слова «цифра» — «палец», а поскольку люди часто считают пальцами, термин «цифра» также стал применяться к числам). ). Все числа в электронной таблице, все текстовые символы в документе Word, все изображения и звуки, хранящиеся на компьютере, ВСЕ представлены в виде чисел.

Вы используете систему счисления с основанием 10 (поскольку у людей 10 пальцев, это им подходит). Когда вы пишете число 1853, например, это означает:

Каждая цифра (0–9) в числе с основанием 10 умножается на степень десяти, соответствующую ее положению. Обратите внимание, что значение каждого разряда в 10 раз превышает значение разряда справа от него. Но вы все это знали, конечно.

Двоичные числа

Но как быть с бедным компьютером, у которого нет пальцев, чтобы считать? База 10 неудобна для использования на компьютере без пальцев. Компьютеры ДЕЙСТВИТЕЛЬНО имеют электрические цепи, которые либо включены, либо выключены. Всего два состояния для работы. Таким образом, натуральная система счисления для использования в электронном компьютере — это основание 2 (так называемая двоичная система счисления). В отличие от вас, у которого есть десять цифр для вычислений (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), у компьютера есть только две цифры (0 и 1), с которыми он должен все делать. Таким образом, в памяти компьютера крошечный транзистор, который включен (проводит ток), может представлять 1, а выключенный транзистор будет представлять 0 (ноль). .

Например, двоичное число 11100111101 означает:

Ах! Значит, это одно и то же число!

1853 (по основанию 10) = 11100111101 (по основанию 2)

Обратите внимание, что каждая позиция двоичной цифры в числе по основанию 2 имеет 2 значение, умноженное на позицию двоичной цифры справа от нее (поскольку это база 2; помните, как работала база 10).

Все время говорить «двоичная цифра» становится громоздко, поэтому был изобретен более короткий термин «бит». Бит — это одна двоичная цифра. Бит может содержать либо 1, либо 0 (ноль). Строка битов может содержать большие числа (точно так же, как вы используете строки из 10-кратной базы для представления чисел больше 9).

Двоичное представление чисел
Основание 10 Основание 2
0 00000000
1 00000001
2 00000010
3 00000011
4 00000100
5 00000101
. .
65 01000001
66 01000010
67 01000011
. .
254 11111110
255 11111111

Особенно удобный фрагмент компьютерной памяти имеет длину 8 бит. Этот кусок памяти может использоваться для представления любого числа от нуля (00000000) до 255 (11111111). Почему 11111111 (по основанию 2) равно 255 (по основанию 10)? Потому что это означает:

1 x 128 + 1 x 64 + 1 x 32 + 1 x 16 +
1 x 8 + 1 x 4 + 1 x 2 + 1 x 1 = 255

И почему это кусок памяти удобного размера? Потому что, если мы хотим представить все символы английского алфавита, 8 цифр — это первая степень числа 2, которая дает вам достаточно возможностей для этого (длинный 4-битный фрагмент может содержать только числа от нуля до 7. недостаточно) .

У нас есть специальное имя для фрагмента памяти длиной 8 бит: он называется байтом. Это основная единица, которую мы используем для измерения объема памяти компьютера. (Кусок памяти длиной 4 бита называется «кусок», но вам не нужно знать это для теста.)

Текстовые символы представлены в памяти компьютера в виде чисел. Как? Вам нужна схема приравнивания букв к цифрам. Используемая система называется кодом ASCII (американский стандартный код для обмена информацией). Заглавная буква A представлена ​​числом 65 в коде ASCII (65 — это 01000001 в двоичном формате). Первые 65 кодов ASCII (от 0 до 64) используются для набора управляющих символов и специальных символов, поэтому заглавная буква А оказалась 65. Заглавная буква Б равна 66 (01000010) и так далее.

< /tr>
Представление символов ASCII (просто пример )
Символ Основание 10 Основание 2
(возврат ) 13 00001101
(пробел) 32 00100000
! 33 00100001
1 49 00110001
2 50 00110010
@ 64 01000000
A 65 01000001
B 66 01000010
C 67 01000011
a 97 01100001
b 98 01100010
c 99 01100011
(удалить) 127 01111111

Как компьютер узнает, является ли 01000001 в байте памяти числом 65 или буквой A? Поскольку прикладная программа отслеживает, что и куда помещается в память, MS Word знает, что данный байт, в котором хранится текст, содержит числа, представляющие буквы.

Для иностранных алфавитов, которые содержат намного больше букв, чем английский (например, японский кандзи), теперь используется более новое расширение схемы ASCII, называемое Unicode (для хранения каждой буквы используется два байта; два байта дают 65 535 различных значений для представления символов).

Изображения также представлены в виде чисел на компьютере. Если вы внимательно посмотрите на экран своего дисплея, то увидите, что изображение на нем состоит из множества маленьких точек, называемых элементами изображения (что чаще сокращается до пикселя). Каждый пиксель изображения на экране может быть представлен в компьютере тремя байтами; числа в байтах сообщают дисплею, сколько красного, синего и зеленого света нужно смешать, чтобы получился цвет пикселя (три байта могут представлять миллионы возможных цветов для каждого пикселя).

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

Килобайты, мегабайты, гигабайты и т. д.

Емкость памяти и емкость хранилища данных для компьютеров измеряются в байтах. Размеры файлов также измеряются в байтах (помните, что один байт равен 8 битам). Однако размер байта невелик (он может содержать только один символ), поэтому мы используем более крупные единицы:

Килобайт ( КБ ) составляет примерно 1000 байт. Но это НЕ ровно 1000 байт; это 1024 байта. Почему такое странное число, как 1024? Потому что 1024 — это ровно 10000000000 в двоичном формате; хорошее число, кратное двум, очень удобно для компьютера. Так что помните: когда компьютер сообщает вам, что ваш файл занимает 40 килобайт, на самом деле он использует 40 960 байт (а не 40 000). Но вы можете думать о килобайте как о «примерно 1000 байтов», откуда он и получил свое название. Размер этого файла веб-страницы составляет примерно 20 КБ.

Точно так же вы можете думать о мегабайте ( МБ ) примерно как о миллионе байтов, но это точно 1 048 576 байт (1024 x 1024). Приложение MS Word занимает около 13 МБ на жестком диске компьютера (в зависимости от версии). Типичный персональный компьютер может иметь 512 МБ памяти.

Гигабайт ( ГБ ) равен приблизительно одному миллиарду байтов (точно 1 073 741 824). Корневое слово для слова «гига» такое же, от которого произошло наше слово «гигант», поэтому технически «гигабайт» следует произносить с мягкой «г», но допустимо произношение как с твердой, так и с мягкой «г». Емкость стандартного жесткого диска измеряется десятками или сотнями ГБ.

Если вам интересно, триллион байт – это терабайт, но возможности ПК еще не достигли этого предела.

Примечание. Чтобы еще больше запутать ситуацию, многие производители указывают емкость своих жестких дисков и других устройств в килобайтах, которые составляют ровно 1000 байт. Это имеет преимущество (для них) в том, что их продукты кажутся на 2,4% больше. Для целей этого класса мы будем использовать определение килобайта = 1024 байта.

В Java, если у меня есть строка x , как я могу вычислить количество байтов в этой строке?

Столбец базы данных может иметь ограничение длины в байтах, например VARCHAR2 (4000 БАЙТ) в Oracle. Кто-то может захотеть узнать количество байтов строки в желаемой кодировке, чтобы узнать, подходит ли строка.

Я полагаю, что есть две возможные интерпретации этого вопроса, в зависимости от намерения. Одна из них — «сколько памяти использует моя строка?». Ответ на это предоставлен @roozbeh ниже (возможно, по модулю тонкостей VM, таких как сжатый OOPS). Другой: «Если я преобразую строку в байт [], сколько памяти будет использовать этот массив байтов?». На этот вопрос отвечает Анджей Дойл. Разница может быть большой: «Hello World» в UTF8 составляет 11 байт, а String (согласно @roozbeh) — 50 байт (если мои расчеты верны).

Я должен был добавить, что 11 байтов не включают накладные расходы объекта byte[], который их содержит, поэтому сравнение несколько вводит в заблуждение.

9 ответов 9

Строка — это список символов (т. е. кодовых точек). Количество байтов, необходимых для представления строки, полностью зависит от того, какую кодировку вы используете для ее преобразования в байты.

Тем не менее, вы можете преобразовать строку в массив байтов, а затем посмотреть на ее размер следующим образом:

Итак, вы видите, что даже простая строка "ASCII" может иметь разное количество байтов в своем представлении, в зависимости от того, какая кодировка используется. Используйте любой набор символов, который вас интересует для вашего случая, в качестве аргумента для getBytes() . И не попадайтесь в ловушку, предполагая, что UTF-8 представляет каждый символ как один байт, так как это тоже неверно:

(Обратите внимание: если вы не указываете аргумент набора символов, используется набор символов по умолчанию платформы. Это может быть полезно в некоторых контекстах, но в целом вам следует избегать зависимости от значений по умолчанию, и всегда используйте явный набор символов, когда требуется кодирование/декодирование.)

поэтому еще раз, если я использую getBytes(). Это даст мне длину, такую ​​​​же, как x.length, я ошибаюсь, потому что я не уверен

@Green Ash Длина массива байтов -- getBytes() -- и x.length МОГУТ совпадать, но это не гарантируется. Он будет равен, если все символы представлены одним байтом каждый. Это всегда будет справедливо для кодировок символов, в которых используется один байт на символ (или меньше), таких как ISO-8859-1. UTF-8 использует 1 или 2 байта, поэтому это зависит от конкретных символов в строке. Кроме того, существуют кодировки символов, в которых всегда используется два байта на символ.

мне нравится ваш ответ :), так что они могут быть как-то одинаковыми, но не всегда ли я прав? Ok. тогда можно ли использовать метод без параметра, потому что это вызывает у меня ошибку!!

@Green Дело в том, что количество байтов не всегда совпадает с количеством символов. Количество байтов зависит от используемой кодировки символов. Вам нужно будет знать, какую кодировку символов вы собираетесь использовать, и принять это во внимание. Какую ошибку вы получаете? Если вы просто используете getBytes(), он будет использовать кодировку символов по умолчанию вашей системы.

@KorayTugay Да, более или менее. Однако вы можете поспорить о порядке причин и следствий. Я был бы более склонен утверждать, что char всегда имеет размер 2 байта, потому что это примитивный тип данных, определенный шириной 2 байта. (И что представление UTF-16 было в основном следствием этого, а не наоборот.)

Если вы работаете с 64-битными ссылками:

На 32-разрядной или 64-разрядной ВМ со сжатыми ООП (-XX:+UseCompressedOops) ссылки занимают 4 байта. Итого будет:

При этом не учитываются ссылки на строковый объект.

Я предполагал, что вопрос касается количества байтов, выделенных в памяти для объекта String. Если вопрос касается количества байтов, необходимых для сериализации строки, как указывали другие, это зависит от используемой кодировки.

Педантичный ответ (хотя и не обязательно самый полезный, в зависимости от того, что вы хотите сделать с результатом):

Строки Java физически хранятся в кодировке UTF-16BE, которая использует 2 байта на кодовую единицу, а String.length() измеряет длину в кодовых единицах UTF-16, поэтому это эквивалентно:

И это покажет вам размер внутреннего массива символов в байтах.

Примечание. "UTF-16" даст результат, отличный от "UTF-16BE", поскольку предыдущая кодировка будет вставлять спецификацию, добавляя 2 байта к длине массива.

@finnw Вы уверены, что используется кодировка UTF-16BE, а не UTF-16? Согласно Javadoc класса String (docs.oracle.com/javase/6/docs/api/java/lang/String.html), «String представляет собой строку в формате UTF-16».

но извините меня, когда я компилирую ваш код, он выдает ошибку; из-за параметра «UTF-8». Где, когда я передаю пустой параметр, он дает мне длину, такую ​​же, как x.length . я неправильно понимаю концепцию. помогите пожалуйста

чтобы было ясно, это вывод: test.java:11: незарегистрированное исключение java.io.UnsupportedEncodingException; должен быть пойман или объявлен для выбрасывания byte[] b = s.getBytes("UTF-8"); ^ 1 ошибка Процесс завершен.

Экземпляр String выделяет определенное количество байтов в памяти. Может быть, вы ищете что-то вроде sizeof("Hello World"), которое вернет количество байтов, выделенных самой структурой данных?

Читайте также: