当前位置: 首页 > 知识库问答 >
问题:

关于整数数据类型和促销

柴翰藻
2023-03-14
  • 平台: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位的对应类型效率低,但我不知道这是不是真的。

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个答案

柯树
2023-03-14

这包括两个部分:

>

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

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

    举个例子:

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

    在这种情况下,结果是:

    return ((long long) c) * x;
    

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

    使用int而不是

    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;
    

  •  类似资料:
    • 问题内容: 如果在表的一列中,我希望这些值是“是”,“否”或“可选”,那么我需要使用哪种数据类型? 问题答案: 少量: 占用1个字节,但是最多可以将8个BIT字段合并到SQL Server中的单个BYTE中。 存储以下两个值之一:1(表示true)和0(表示false),因此该列需要为可空值,以便NULL作为您的第三个值传递 CHAR(1) 需要1个字节 如果不区分大小写ASCII,则为26个字符

    • 以下代码片段输出结果是什么? var a = 1; var b = {value: 1}; var c = new Number(1); function foo(v){ v.value = "new Value"; } foo(a); foo(b); foo(c); console.log('a:',a) console.log('b:',b) console.log('c:',c

    • 问题内容: 我想知道和占用的内存是否存在差异 。 我知道通常占用4个字节,怎么样 问题答案: 通常,热点中的Java对象使用的堆内存包括: 对象标头,由几个字节的“内务处理”信息组成; 存储器为 原始 字段,根据它们的大小(中间体N-> 32位) 用于 参考 字段的存储器(每个4字节)(整数n-> 32位) 填充:可能在对象数据之后一些“浪费”的未使用字节,以使每个对象都从一个方便的字节数开始的地

    • SQLAlchemy为最常见的数据库数据类型提供了抽象,并提供了一种指定您自己的自定义数据类型的机制。 类型对象的方法和属性很少直接使用。类型对象提供给 Table 定义和可以作为类型提示提供给 functions 对于数据库驱动程序返回错误类型的情况。 >>> users = Table('users', metadata, ... Column('id', Inte

    • 列和数据类型 泛型类型 SQL标准和多个供应商类型 供应商特定类型 自定义类型 重写类型编译 扩充现有类型 typedecorator配方 将编码字符串强制为Unicode 四舍五入数字 将时区感知时间戳存储为时区原始UTC 后端不可知guid类型 封送JSON字符串 应用SQL级绑定/结果处理 重新定义和创建新的运算符 创建新类型 使用自定义类型和反射 基本类型API

    • 这两者有什么区别?基元类型不能有“类”,可以吗?它是基元类型。没有对象具有类。 这两者有什么不同?