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