C++ 动态整数大小:int64\u t、int32\u t、uint32\u t等

C++ 动态整数大小:int64\u t、int32\u t、uint32\u t等,c++,math,runtime,function-pointers,dynamic-sizing,C++,Math,Runtime,Function Pointers,Dynamic Sizing,我正在编写一个应用程序,允许用户选择整数存储的位大小并对其进行计算。他们可以选择8、16、32或64位存储作为有符号或无符号存储。这是在运行时设置和更改的,应用程序将使用给定的类型进行计算 用户交互示例: 进入16位模式 5C型 新闻加号 2A型 新闻评估 返回{value1.getSigned16()+value2.getSigned16();} 我希望避免为每个操作员编程8个案例。我认为一个指针或函数指针可以很好地解决这个问题。evaluate方法不关心我使用的整数的大小,只要它们都

我正在编写一个应用程序,允许用户选择整数存储的位大小并对其进行计算。他们可以选择8、16、32或64位存储作为有符号或无符号存储。这是在运行时设置和更改的,应用程序将使用给定的类型进行计算

用户交互示例:

  • 进入16位模式
  • 5C型
  • 新闻加号
  • 2A型
  • 新闻评估
    • 返回{value1.getSigned16()+value2.getSigned16();}
我希望避免为每个操作员编程8个案例。我认为一个指针或函数指针可以很好地解决这个问题。evaluate方法不关心我使用的整数的大小,只要它们都相同。问题是我不知道如何实现它,因为指针关心返回什么类型的变量。我考虑过使用通用指针,但当我需要取消引用时,这对我没有帮助,我仍然需要这8种情况

value1.getProperSize() + value2.getProperSize();

// * This obviously won't work
int* getProperSize() {
    if (size == 16) return (int16_t)storageValue;
    if (size == 32) return (int32_t)storageValue;
    // Etc...
}
如果您有任何关于解决此问题的想法或建议,我们将不胜感激。

函数的返回值类型不能是“任意”的。如果要返回不同大小的整数,有几种方法:联合、函数重载、模板(这将覆盖函数重载)或(键入时我会畏缩)
void*
返回值

根据您的要求,工会可能是最合适的:

struct MyInteger
{
    uint8_t intSize;
    union
    {
        int8_t  Int8;
        int16_t Int16;
        int32_t Int32;
        int64_t Int64;
    } intValue;
};

MyInteger getProperSize()
{
    MyInteger result;
    if (size == 8)
    {
        result.intSize = 8;
        result.intvalue.Int8 = someValue;
    }
    // ...
    return result;
}
此结构的大小至少为72位(不包括填充和对齐问题),因此您可以很容易地返回
int64\t
,它将覆盖每个较小的整数大小。

函数不能有“任意”返回值类型。如果要返回不同大小的整数,有几种方法:联合、函数重载、模板(这将覆盖函数重载)或(键入时我会畏缩)
void*
返回值

根据您的要求,工会可能是最合适的:

struct MyInteger
{
    uint8_t intSize;
    union
    {
        int8_t  Int8;
        int16_t Int16;
        int32_t Int32;
        int64_t Int64;
    } intValue;
};

MyInteger getProperSize()
{
    MyInteger result;
    if (size == 8)
    {
        result.intSize = 8;
        result.intvalue.Int8 = someValue;
    }
    // ...
    return result;
}

此结构的大小至少为72位(不包括填充和对齐问题),因此您可以很容易地返回一个
int64\t
,它将覆盖每个较小的整数大小。

始终将值存储为最大的数据类型。对你来说重要的是在算术过程中截断。您可以通过传递一个全宽值加上位宽(模式)来实现这一点。

始终将该值存储为最大的数据类型。对你来说重要的是在算术过程中截断。您可以通过传递一个全宽度值加上位宽度(模式)来实现这一点。

您实际上不必对不同的类型进行算术运算。只需使用64位进行计算,并将结果转换为位大小

实际上,您不必对不同的类型进行运算。只需使用64位进行计算,并将结果转换为位大小

吹毛求疵:由于结构填充/对齐,它可能是128位。@Mystical True。。。我会调整措辞以更好地表达我的意思。谢谢!模板函数似乎是这里的理想解决方案。不太清楚为什么我没有想到。吹毛求疵:可能是128位,因为结构填充/对齐。@mystical True。。。我会调整措辞以更好地表达我的意思。谢谢!模板函数似乎是这里的理想解决方案。我不太清楚为什么我没有想到。需要注意的是,你需要截断每个中间值,而不仅仅是最终结果,以达到与对较小类型进行运算相同的效果。假设2的补码运算,你只需要在除法之前截断;加法和乘法会自行处理…需要注意的是,您需要截断每个中间值,而不仅仅是最终结果,以获得与对较小类型进行运算相同的效果;加法和乘法会自动处理。。。