2016-11-08 3 views
3

Когда я прочитал исходный код git, меня смущает этот макрос.Приближение длины десятичного представления типа

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

The code is here

Но когда я пытаюсь вычислить приближение длины десятичного представления типа, я думаю, что ответ

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

, которые можно было бы написать, как

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

Не могли бы вы рассказать мне, почему git вычисляет длину на "(sizeof (x) * 2.56 + 0.5)" вместо "(sizeof (x) * 2.41)"?
Большое спасибо.

+1

«Почему что-то разработанное таким образом» обычно не отвечает на StackOverflow, потому что только автор может дать окончательный ответ. –

+1

Я предполагаю, что это используется для вычисления максимального количества символов, необходимых для печати целого числа со знаком данного типа. Ваши рассуждения верны. Но пока вычисление дает правильный ответ, когда 'sizeof (x)' равно 1, 2, 4 или 8, тогда это не имеет большого значения. –

+1

Должно быть '((int) (sizeof (x) * 2.41 + 1.65))', чтобы получить правильный ответ от 8-битного до 128-битного. – user3386109

ответ

3

Похоже на возможность выпечки! Вот результаты, которые я получаю от четырех различных размеров номера:

A = (sizeof(x) * 2.56 + 0.5) + 1 
B = (sizeof(x) * 2.41) + 1 
C = (sizeof(x) * 2.41 + 1.65) 

strlen A B C 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) 

Престижность user3386109. Все эти схемы пытаются оценить максимально возможную длину, а не фактическую длину (т. Е. Им не важно, какое значение «х» содержит). Ниже приведен код, который я использовал для создания приведенной выше таблицы. Я не включил long long, так как на моей системе он имеет тот же размер, что и 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; 
} 
+0

Большое спасибо. Я проигнорировал отрицательное число. –