Aproximación de la longitud de la representación decimal de un tipo

Cuando leo el código fuente de git, estoy confundido por esta macro.

/* Approximation of the length of the decimal representation of this type. */ #define decimal_length(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) 

El código esta aqui

Pero cuando trato de calcular la aproximación de la longitud de la representación decimal de un tipo, creo que la respuesta es

  ((int)(sizeof(x) * 8 * ln2 ) + 1) 

que podría ser escribir como

  ((int)(sizeof(x) * 2.41 ) + 1) 

¿Podría decirme por qué el git calcula la longitud por "(sizeof (x) * 2.56 + 0.5)" en lugar de "(sizeof (x) * 2.41)"?
Muchas gracias.

¡Parece una oportunidad para cocinar! Estos son los resultados que obtengo de cuatro tamaños de numbers diferentes:

 A = (sizeof(x) * 2.56 + 0.5) + 1 B = (sizeof(x) * 2.41) + 1 C = (sizeof(x) * 2.41 + 1.65) strlen ABC Number (bytes) 4 4 3 4 -127 (1) 6 6 5 6 -32767 (2) 11 11 10 11 -2147483647 (4) 20 21 20 20 -9223372036854775807 (8) 

Felicitaciones a usuario3386109 . Todos estos esquemas intentan estimar la longitud máxima posible, no la longitud real (es decir, no les importa qué valor contenga 'x'). A continuación se muestra el código que utilicé para generar la tabla anterior. No incluí por long long ya que en mi sistema es del mismo tamaño que de long .

 #include <stdio.h> #include <string.h> #define decimal_length1(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) #define decimal_length2(x) ((int)(sizeof(x) * 2.41) + 1) #define decimal_length3(x) ((int)(sizeof(x) * 2.41 + 1.65)) int main() { char buffer[1024]; char a = -127; short b = -32767; int c = -2147483647; long int d = -9223372036854775807L; printf("A = (sizeof(x) * 2.56 + 0.5) + 1\n"); printf("B = (sizeof(x) * 2.41) + 1\n"); printf("C = (sizeof(x) * 2.41 + 1.65)\n\n"); printf("strlen\tA\tB\tC\tNumber (bytes)\n\n"); sprintf(buffer, "%hhd", a); printf("%lu\t%d\t%d\t%d\t%s (%lu)\n", strlen(buffer), decimal_length1(a), decimal_length2(a), decimal_length3(a), buffer, sizeof(a)); sprintf(buffer, "%hd", b); printf("%lu\t%d\t%d\t%d\t%s (%lu)\n", strlen(buffer), decimal_length1(b), decimal_length2(b), decimal_length3(b), buffer, sizeof(b)); sprintf(buffer, "%d", c); printf("%lu\t%d\t%d\t%d\t%s (%lu)\n", strlen(buffer), decimal_length1(c), decimal_length2(c), decimal_length3(c), buffer, sizeof(c)); sprintf(buffer, "%ld", d); printf("%lu\t%d\t%d\t%d\t%s (%lu)\n", strlen(buffer), decimal_length1(d), decimal_length2(d), decimal_length3(d), buffer, sizeof(d)); return 0; }