Точность в дополнение - PullRequest
       3

Точность в дополнение

0 голосов
/ 11 февраля 2011

Я работаю над инструментом в C, чтобы подсчитать некоторые входящие / исходящие биты, я хочу сохранить биты и не потерять их, перейдя в байты.

В конце я хочу отобразить скачанные биты xxxxx/ закачано.Я ставлю максимум на 10 ГБ = 85899345920 бит, для представления которого требуется примерно 35 бит.Я использую 32-битную ОС.Я пробовал unsigned long и unsigned int, но они перегружены.

Есть ли простой способ получить процесс сложения и сохранить точность?

Ответы [ 4 ]

5 голосов
/ 11 февраля 2011

Вы можете использовать гибридный подход: сохранить число байтов в одной переменной и количество битов , которые являются дополнительными в другой переменной.Аналогично тому, как системы POSIX возвращают время с начала эпохи в обе секунды и микросекунды:

       struct timeval {
           time_t      tv_sec;     /* seconds */
           suseconds_t tv_usec;    /* microseconds */
       };

Когда вы получаете передачу 1505 битов, сохраняйте:

bytes += (1505/8); // ==188
bits += (1505%8); // ==1

Таким образом, вы можете отслеживать биты.

Или вы можете извлечь из этого все самое интересное и использовать long long.

2 голосов
/ 11 февраля 2011

Если вы используете MSVC, вы можете использовать __int64 или LONGLONG.

Это, или эквиваленты, могут поддерживаться в других.

Если нет, я думаю, вы должны пойти с Джоответьте, но при необходимости просто сохраните дополнительные от 0 до 7 бит в отдельном символе или int.Любые другие дополнительные биты должны идти в это хранилище, и когда оно «переполняется» (то есть 8 бит или более), просто уберите 8, но добавьте 1 к вашему количеству байтов.

РЕДАКТИРОВАТЬ: long long?

1 голос
/ 11 февраля 2011

uint64_t (из <stdint.h>) даст вам 64 бита. (Для вашего конкретного компилятора и ОС это то же самое, что и unsigned long long, но для этого лучше использовать тип фиксированной ширины, например uint64_t).

1 голос
/ 11 февраля 2011

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

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