0
  • プラットフォーム: Linux 3.2.0 x86 (Debian 7.1)
  • コンパイラ: GCC 4.7.2 (Debian 4.7.2-5)

引数に整数値 (基数) を受け入れる整数から文字列への変換関数を作成しています。整数引数 (基数) の有効範囲は非常に小さく (2 ~ 36)、char の最大サイズよりも小さいです。したがって、引数をcharとして宣言したいのですが、long long intに上記の引数を掛ける必要があり、それがどのように機能するのか疑問に思っています。計算プロセスに余分なものが追加される場合、引数を char として宣言したくありません。したがって、私の質問は、計算自体に関して long long int を char で乗算するとどうなるかです。また、この関数は、最悪の場合、unsigned char の最大サイズよりも小さい少量のデータを書き込むため、短い int を使用してインデックスを付けたいと考えています。これは、char を使用してポインターを逆参照しようとすると警告が表示されるためです。

int integer_conversion(long long int integer, char *str, short int str_size, char radix)
{
    //'i' is the index variable I was talking about.
short int i = 1;
long long int radix_place = 1;

if(str == NULL) return -1;
if(str_size <= 0) return -2;

if(integer < 0)
{
            //radix_place(long long int) * radix(char)
    for(; integer / radix_place <= -radix; radix_place *= radix, i++);
    i++;

    if(i > str_size) return -4;

    str[i] = '\000';
    i--;

    if(radix >= 2 && radix <= 10)
    {
        for(; i >= 1; i--)
        {
                            //integer(long long int) mod radix(char)
            str[i] = -(integer % radix) + '0';
                            //integer(long long int) / radix(char)
            integer /= radix;
        }
    }
    else if(radix >= 11 && radix <= 36)
    {
        for(; i >= 1; i--)
        {
                            //integer(long long int) mod radix(char)
            str[i] = -(integer % radix);

                            //Is any type of conversion or promotion preformed here?
            if(str[i] <= 9) str[i] += '0';
            else str[i] += '7';

                            //integer(long long int) / radix(char)
            integer /= radix;
        }
    }
    else return 2354;

    str[0] = '-';
}
else
{
            //radix_place(long long int) * radix(char)
    for(; integer / radix_place >= radix; radix_place *= radix, i++);

    if(i > str_size) return -4;

    str[i] = '\000';
    i--;

    if(radix >= 2 && radix <= 10)
    {
        for(; i >= 0; i--)
        {
                            //integer(long long int) mod radix(char)
            str[i] = integer % radix + '0';
                            //integer(long long int) / radix(char)
            integer /= radix;
        }
    }
    else if(radix >= 11 && radix <= 36)
    {
        for(; i >= 0; i--)
        {
                            //integer(long long int) mod radix(char)
            str[i] = integer % radix;

                            //Is any type of conversion or promotion preformed here?
            if(str[i] <= 9) str[i] += '0';
            else str[i] += '7';

                            //integer(long long int) / radix(char)
            integer /= radix;
        }
    }
    else return 2354;
}

return 0;
}
4

1 に答える 1

2

これには 2 つの部分があります。

  1. 効率。int最新のプロセッサでは、関数パラメーターやローカル変数など、ほとんどの場所よりも短い型を宣言しても効率は向上しません。char小さなマイクロコントローラー用に書いている場合は、またはunsigned charパラメーターが役立つかもしれません。

  2. 正しさ。すべての整数型 ( を含む) は、適合しない場合を除き、char最初に に昇格されます。次に、「通常の算術変換」により、ほとんどの操作で両方の型が同じ型に昇格されます。intunsigned int

次に例を示します。

char c;
long long x;
return c * x;

この場合、結果は次のようになります。

return ((long long) c) * x;

(おそらく、sizeof(long long) == 1CHAR_BIT == 64、およびcharがデフォルトで署名されていない場合を除きます。しかし、それは実に病理学的なケースです。)

おすすめ

intの代わりに使用しshortます。

int integer_conversion(long long int integer, char *str, int str_size, int radix)
{
    // don't bother with "short"
    int i = 1;
    long long int radix_place = 1;

    if(str == NULL) return -1;
    if(str_size <= 0) return -2;
于 2013-11-06T04:03:01.213 に答える