关于整数数据类型和促销 平台:Linux 3.2.0 x86(Debian 7.1) 编译器:GCC 4.7.2(Debian 4.7.2-5)

关于整数数据类型和促销 平台:Linux 3.2.0 x86(Debian 7.1) 编译器:GCC 4.7.2(Debian 4.7.2-5),c,C,我正在编写一个整数到字符串转换函数,它接受一个参数的整数值(基数)。整数参数(基数)的有效范围非常小(2-36),小于字符的最大大小。所以我想把这个参数声明为char,但是我必须用这个参数乘以一个long-long int,我想知道它到底是怎么工作的。我不想将参数声明为char,如果这会给计算过程增加任何额外的内容。所以我的问题是,当我把一个长整型乘以一个字符,计算本身会发生什么。此外,该函数在最坏情况下写入的数据量小于无符号字符的最大大小,因此我希望使用短int对其进行索引,因为当我尝试使用字

我正在编写一个整数到字符串转换函数,它接受一个参数的整数值(基数)。整数参数(基数)的有效范围非常小(2-36),小于字符的最大大小。所以我想把这个参数声明为char,但是我必须用这个参数乘以一个long-long int,我想知道它到底是怎么工作的。我不想将参数声明为char,如果这会给计算过程增加任何额外的内容。所以我的问题是,当我把一个长整型乘以一个字符,计算本身会发生什么。此外,该函数在最坏情况下写入的数据量小于无符号字符的最大大小,因此我希望使用短int对其进行索引,因为当我尝试使用字符取消引用指针时,会收到警告。所以我的问题是,为什么指针不能被字符解引用,当我将索引的值增加或减少1时,使用短int作为索引是否会给解引用过程或计算过程添加任何内容。这些行为是否一致,因为我听说某些系统上的16位整数数据类型在算术方面实际上比32位整数数据类型的效率低,但我不知道这是不是真的

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;
}
int-integer\u转换(长整型,字符*str,短整型,字符基数)
{
//“i”是我所说的索引变量。
短整数i=1;
long-long-int基数_-place=1;
if(str==NULL)返回-1;
如果(str_size=2&&radix=1;i--)
{
//整数(长整数)模基数(字符)
str[i]=-(整数%基数)+“0”;
//整数(长整型)/基数(字符)
整数/=基数;
}
}
else如果(基数>=11&&radix=1;i--)
{
//整数(长整数)模基数(字符)
str[i]=-(整数%基数);
//这里是否有任何类型的转换或提升?
如果(str[i]=基数;基数_位置*=基数,i++);
如果(i>str_size)返回-4;
str[i]='\000';
我--;
如果(基数>=2&&radix=0;i--)
{
//整数(长整数)模基数(字符)
str[i]=整数%基数+0';
//整数(长整型)/基数(字符)
整数/=基数;
}
}
else如果(基数>=11&&radix=0;i--)
{
//整数(长整数)模基数(字符)
str[i]=整数%基数;
//这里是否有任何类型的转换或提升?
如果(str[i]与此相关的两部分:

  • 效率。在现代处理器上,在大多数情况下,声明小于
    int
    的类型(例如函数参数和局部变量)并不会提高效率。如果为小型微控制器编写,可能
    char
    unsigned char
    参数会很有用

  • 正确性。所有整数类型(包括
    char
    )将首先升级为
    int
    ,除非它们不适合,在这种情况下,它们将升级为
    无符号int
    ,除非它们不适合。然后,“常用算术转换”将大多数操作中的两种类型升级为同一类型

  • 下面是一个例子:

    char c;
    long long x;
    return c * x;
    
    在这种情况下,结果是:

    return ((long long) c) * x;
    
    (除非默认情况下,
    sizeof(long-long)==1
    CHAR\u位==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;
    
    int-integer\u转换(长整型,字符*str,int-str\u大小,整数基数)
    {
    //不要为“短”而烦恼
    int i=1;
    long-long-int基数_-place=1;
    if(str==NULL)返回-1;
    
    if(str_size)在您编写代码并实际需要提高效率之前,不要担心效率,尤其是选择正确的整数大小的效率。过早优化是万恶之源。@Aniket您是对的,我刚刚更新了这个问题。jwodder函数大部分都完成了。