gpt4 book ai didi

c - 关于整数数据类型和提升

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:36 24 4
gpt4 key购买 nike

  • 平台: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 的最大大小,因此我想使用 short int 对其进行索引,因为当我尝试使用 char 取消引用指针时,我会收到警告。所以我的问题是,为什么指针不能被 char 取消引用,并且当我将索引的值增加或减少 1 时,使用 short 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;
}

最佳答案

分为两部分:

  1. 效率。在现代处理器上,在大多数地方声明短于 int 的类型不会提高效率,例如函数参数和局部变量。如果您正在为小型微 Controller 编写代码,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;

关于c - 关于整数数据类型和提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19803462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com