Размер целых чисел? - PullRequest
       19

Размер целых чисел?

1 голос
/ 18 февраля 2010

Это связано с вопросом, который я прочитал вчера: Как определить, сколько байтов нужно целому числу?

В любом случае, часть, о которой у I есть вопрос, такова:

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

1012 *, например *

int: 10 = 1 байт

int: 257 = 2 байта

Мой вопрос: почему для 10 требуется 1 байт, а для 257 - 2? Насколько я понимаю, вы можете представить 10 как 1010, что составляет 4 бита, и 257 как 100000001, что составляет 9 бит. Это имеет отношение к размеру слова? Разве у вас не может быть только 4 бита, но вам нужен целый байт, и у вас не может быть только 9 бит, вам нужны целые 2 байта?

Ответы [ 4 ]

3 голосов
/ 18 февраля 2010

Правильно, байты имеют размер 8 бит каждый 1 , и вы обычно не можете их подразделить.

1 Обычно (дляпеданты и троглодиты).

1 голос
/ 18 февраля 2010

Хех, да, у каждого байта есть адрес, поэтому вы не можете использовать меньше одного.

На самом деле немного сложнее использовать менее 4 или 8, потому что доступ к невыровненным скалярам медленный, и поэтому языковые процессоры склонны выравнивать адресуемые объекты с кратными 4, 8 или даже 16, когда дело касается блоков кеша. Фактическая шина данных, скорее всего, равна ширине регистра, поэтому, если объект не выровнен (32 или 64 бита, как правило), тогда на самом деле два объекта должны быть пойманы и объединены процессором. Это медленно и поэтому компилятор защищает от этого.

Иногда добавляется еще больше выравнивания.

Как правило, объявление отдельного объекта получит выравнивание в 4 или 8 байтов, но функция, модуль (входной файл компоновщика) или другой большой объект может получить 16 или 32, потому что использование блока частичного кэша приводит к потере неиспользуемый раздел блока кеша, и производительность кеша сегодня критична.

0 голосов
/ 18 февраля 2010

Нетрудно придумать схемы, которые представляют небольшие числа в уменьшенном количестве байтов или битов. Например, UTF-8 - это способ представления кодовых точек Unicode (до 22 бит) в виде 1, 2 или 3-байтовых последовательностей таким образом, чтобы гарантировать, что кодовые точки в диапазоне от 0 до 127 занимают 1 байт.

Но у этих схем есть обратная сторона: большие числа имеют тенденцию принимать БОЛЬШЕ битов для представления, чем если бы вы их не кодировали. И, кроме того, вы обмениваете количество бит, необходимое для представления чисел, на дополнительное время процессора для кодирования и декодирования чисел.

Мой вопрос: почему для 10 требуется 1 байт, а для 257 требуется 2?

Теоретически это не так / они не делают. Но на практике компьютеры в первую очередь предназначены для работы с кусками 32-битных слов. Адресация памяти на уровне байтов и выполнение арифметических операций с представлением чисел переменного размера будет намного медленнее.

Кроме того, память дешева, поэтому для большинства приложений окупаемости просто недостаточно, чтобы оправдать попытки уменьшить «потери» ниже гранулярности слова.

0 голосов
/ 18 февраля 2010

память выделяется в байтах, и 9 байтов, конечно, потребуется второй блок байта для размещения 9-го бита.

...