.\" Copyright 2026 Andrew V.Kosteltsev (kx@radix-linux.su) .\" .\" .TH _int_digs 3 "September 15, 2026" "libmpu" "LibMPU Programmer's Manual" .SH NAME \fB_int_digs\fP \- максимальный размер буфера для десятичного представления беззнакового целого числа .SH SYNOPSIS .nf .B #include .PP .BI "int _int_digs( int " nb " );" .fi .SH DESCRIPTION Функция \fB_int_digs()\fP возвращает максимальный размер буфера в байтах, достаточный для хранения десятичного представления беззнакового целого числа размером \fBnb\fP байт, включая завершающий символ \fB'\\0'\fP. .PP Функция не анализирует значение самого целого числа. Результат зависит только от размера, заданного параметром \fBnb\fP, поэтому функция может использоваться для выделения памяти под строку до преобразования беззнакового целого LibMPU в десятичное представление. .PP Для целого числа размером \fBnb\fP байт максимальное количество значащих битов равно .sp .nf 8 * nb .fi .sp а максимальное количество десятичных цифр определяется выражением .sp .nf ceil( 8 * nb * log10(2) ). .fi .sp Реализация не использует вычисления с плавающей точкой и функции библиотеки \fBlibm\fP. Используется верхнее рациональное приближение .sp .nf log10(2) < 30103 / 100000 .fi .sp поэтому количество десятичных цифр вычисляется целочисленно как .sp .nf (nb * 30103 + 12499) / 12500 .fi .sp и дополнительно учитывается один байт для завершающего символа \fB'\\0'\fP. .PP В качестве аргумента \fBnb\fP обычно следует передавать одну из констант размера целых чисел, определённых в \fBlibmpu.h\fP, например \fBNB_I8\fP, \fBNB_I16\fP, ..., \fBNB_I65536\fP. .PP Функция не требует наличия арифметического контекста \fBLibMPU\fP и не изменяет флаги целочисленных операций. .SH RETURN VALUE При \fBnb > 0\fP функция возвращает размер буфера, достаточный для размещения наибольшего возможного беззнакового десятичного значения заданного размера вместе с завершающим символом \fB'\\0'\fP. При \fBnb < 1\fP функция возвращает \fB0\fP. .sp Например: .sp .nf _int_digs( NB_I8 ) = 4 _int_digs( NB_I16 ) = 6 _int_digs( NB_I32 ) = 11 _int_digs( NB_I64 ) = 21 _int_digs( NB_I1024 ) = 310 _int_digs( NB_I65536 ) = 19730 .fi .SH EXAMPLES .nf .sp #include #include int main( void ) { int rc = 0; __mpu_init(); __mpu_extra_warnings = 1; { mpu_int65536_t c; int nb = NB_I65536; printf( "sizeof(c) = %d;\\n", (int)sizeof(c) ); /* Максимальный размер буфера в байтах, включая завершающий '\\0'. */ printf( "_int_digs(%d) = %d;\\n", nb, _int_digs(nb) ); printf( "_int_digs(%d) = %d;\\n", NB_I32768, _int_digs(NB_I32768) ); printf( "_int_digs(%d) = %d;\\n", NB_I16384, _int_digs(NB_I16384) ); printf( "_int_digs(%d) = %d;\\n", NB_I8192, _int_digs(NB_I8192) ); printf( "_int_digs(%d) = %d;\\n", NB_I4096, _int_digs(NB_I4096) ); printf( "_int_digs(%d) = %d;\\n", NB_I2048, _int_digs(NB_I2048) ); printf( "_int_digs(%d) = %d;\\n", NB_I1024, _int_digs(NB_I1024) ); printf( "_int_digs(%d) = %d;\\n", NB_I512, _int_digs(NB_I512) ); printf( "_int_digs(%d) = %d;\\n", NB_I256, _int_digs(NB_I256) ); printf( "_int_digs(%d) = %d;\\n", NB_I128, _int_digs(NB_I128) ); printf( "_int_digs(%d) = %d;\\n", NB_I64, _int_digs(NB_I64) ); printf( "_int_digs(%d) = %d;\\n", NB_I32, _int_digs(NB_I32) ); printf( "_int_digs(%d) = %d;\\n", NB_I16, _int_digs(NB_I16) ); printf( "_int_digs(%d) = %d;\\n", NB_I8, _int_digs(NB_I8) ); } __mpu_free_context(); return( rc ); } .fi .sp .SH SEE ALSO .BR ibits_len(3), .BR libmpu(7).