Печать последних 5 цифр в C (восьмеричная база)

Мне было интересно, как я могу напечатать только последние 5 цифр восьмеричного числа на языке программирования C?

Хитрая часть: число не имеет знака в определении, поэтому после некоторых процедур оно выводит что-то вроде 3777777464. То, что я хочу напечатать, это просто 77464.

Я попытался просмотреть руководства по форматированию C, но я узнал, как писать только первые 5 цифр/символов, а не последние 5 в отношении упомянутой сложной части.

Его нужно только отображать в выводе (printf/fprintf в файле).

РЕДАКТИРОВАТЬ и подчеркнуть: код слишком длинный, чтобы публиковать его здесь, он состоит из множества файлов c и заголовков. Для краткости: мне нужно printf("%05o\n",arr[i]); чтобы напечатать только последние 5 цифр. Он печатает что-то вроде 3777777464. Цифры правильные, мне нужны только последние 5 цифр.

Большое спасибо за помощь


person newB    schedule 28.03.2020    source источник
comment
после некоторых процедур он выводит что-то вроде 3777777464 --> опубликуйте этот код.   -  person chux - Reinstate Monica    schedule 28.03.2020
comment
какие процедуры?   -  person Anirban166    schedule 28.03.2020
comment
код слишком длинный, чтобы публиковать его здесь, он состоит из множества файлов c и заголовков. для краткости: мне нужно printf(%05o\n,arr[i]); чтобы напечатать только последние 5 цифр. он печатает что-то вроде 3777777464. числа правильные, мне просто нужны последние 5 цифр   -  person newB    schedule 28.03.2020
comment
Так что используйте представленный код chux. Вы использовали его? К чему это привело? Вы остались довольны результатом? Разве это не ответ на ваш вопрос? i need printf("%05o\n",arr[i]); - что такое arr? что такое i?   -  person KamilCuk    schedule 28.03.2020


Ответы (2)


напечатать только последние 5 (восьмеричных) цифр числа

Получите последние 5 восьмеричных цифр, объединив их с маской 077777.

#define MASK_LAST_5_OCTAL_DIGITS 077777u

//       vv print at least 5 characters, pad with 0 as needed 
printf("%05o\n", (unsigned) (number & MASK_LAST_5_OCTAL_DIGITS));
person Community    schedule 28.03.2020
comment
Не могли бы вы взглянуть на обновленный вопрос? это очень помогло бы, если бы вы могли помочь преодолеть это - person newB; 28.03.2020
comment
из-за преобразования без знака int я получаю что-то вроде 3777777 даже после форматирования %05o. - person newB; 28.03.2020
comment
@newB Действительно нужно увидеть ваш код. - person chux - Reinstate Monica; 28.03.2020

Используйте модульную арифметику на основе базы, например, чтобы извлечь последние 5 цифр из цифры с десятичной базой (база 10), вы должны использовать модуль 10 ^ 5, т.е. number % 10u*10*10*10*10.

Аналогично для восьмеричной или базовой 8 вы можете использовать number% 8u*8*8*8*8. (константа без знака, чтобы избежать целочисленного переполнения)

Альтернативный подход может состоять в том, чтобы преобразовать число в строку и извлечь последние 5 символов, учитывая, что количество цифр больше 5 и в восьмеричной системе с основанием 8. (snprintf со спецификатором формата o является опцией)

person Anirban166    schedule 28.03.2020
comment
Никогда не слышали о восьмеричных литералах? - person the busybee; 28.03.2020
comment
Восьмеричные числа образованы префиксом 0, не так ли? или вы имеете в виду использовать %o в моем ответе? - person Anirban166; 28.03.2020
comment
@thebusybee C определяет восьмеричные константы, но не восьмеричные литералы. - person chux - Reinstate Monica; 28.03.2020
comment
8*8*8*8*8 говорит само за себя. 2 предостережения: с 16-битным int (обычно для встроенных владельцев) 8*8*8*8*8 является int переполнением. Поскольку OP, вероятно, работает с отрицательным значением, лучше использовать константу unsigned, например 8u*8*8*8*8 (которая также не переполняется). С int %(8*8*8*8*8) результат может быть от -32767 до 32767 - даже с 32-битной математикой - person chux - Reinstate Monica; 28.03.2020
comment
Да, правильно, он превышает предел на 1, будучи 2 ^ (3 * 5), я дал ответ с учетом переполнения здесь stackoverflow.com/questions/60226543/ но я полностью забыл об этом здесь.. заставляет меня понять, что я должен учитывать все случаи. Спасибо еще раз. - person Anirban166; 28.03.2020
comment
@chux-ReinstateMonica Верно, стандарт C называет их константами, а стандарт C++ называет их литералами. =-О - person the busybee; 28.03.2020
comment
@thebusybee Полезная часть разницы в терминах заключается в том, что литералы в C (строка, составной) могут иметь свой адрес, тогда как константы не могут. - person chux - Reinstate Monica; 28.03.2020