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

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

В любом случае, у у меня есть вопрос:

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

e.g.

интервал: 10 = 1 байт

интервал: 257 = 2 байта

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


person hodgesmr    schedule 18.02.2010    source источник


Ответы (4)


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

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

person Greg Hewgill    schedule 18.02.2010

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

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

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

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

person DigitalRoss    schedule 18.02.2010

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

person Vinay Pandey    schedule 18.02.2010

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

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

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

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

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

person Stephen C    schedule 18.02.2010