2016-11-08 13 views
3

gitのソースコードを読むと、このマクロが混乱します。型の10進表現の長さの近似

/* 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

しかし、私はタイプの10進数表現の長さの近似値を計算しようとすると、私は答えは

として記述することができ
((int)(sizeof(x) * 8 * ln2) + 1) 

だと思います

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

gitが長さを計算する理由を教えてください。 "(sizeof(x)* 2.41)"の代わりに "(sizeof(x)* 2.56 + 0.5)"ですか?
ありがとうございました。

+1

"なぜこのように設計されているのですか"は、通常、著者が決定的な回答を与えることができるため、StackOverflowでは対応できません。 –

+1

私は、指定された型の符号付き整数を出力するのに必要な最大文字数を計算するために使用されていると仮定します。あなたの推論は正しいです。しかし、sizeof(x)が1,2,4、または8であるときに正しい答えが得られる限り、それは本当に重要ではありません。 –

+1

8ビットから128ビットに正解を得るには '((int)(sizeof(x)* 2.41 + 1.65))')にする必要があります。 – user3386109

答えて

3

ベークオフの機会のようですね! user3386109へ

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) 

賞賛:ここで私は、4つの異なる数のサイズから取得する結果があります。これらのスキームはすべて、実際の長さではなく、可能な限り最大の長さを見積もります(つまり、 'x'に含まれる値が何であるかは気にしません)。以下は上記の表を生成するために使用したコードです。 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

ありがとうございました。私は負の数を無視した。 –

関連する問題