0
  • 平台:Linux 3.2.0 x86 (Debian 7.1)
  • 编译器:GCC 4.7.2 (Debian 4.7.2-5)

我正在编写一个整数到字符串的转换函数,它接受一个整数值(基数)作为参数。整数参数(基数)的有效范围非常小(2-36),小于字符的最大大小。所以我想将参数声明为 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

两个部分:

  1. 效率。在现代处理器上,声明类型比int大多数地方短,例如函数参数和局部变量,并没有提高效率。如果您正在为小型微控制器编写,也许charunsigned char参数会很有用。

  2. 正确性。所有整数类型(包括char)将首先被提升为int,除非它们不适合,在这种情况下,它们会被提升为unsigned int,除非它们不适合。然后“通常的算术转换”将大多数操作中的两种类型提升为相同的类型。

这是一个例子:

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

在这种情况下,结果是:

return ((long long) c) * x;

(除非,也许,sizeof(long long) == 1CHAR_BIT == 64char默认情况下是无符号的。但这是一个彻头彻尾的病态案例。)

推荐

使用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 回答