动态整数大小:int64_t,int32_t,uint32_t等

时间:2014-01-31 19:46:55

标签: c++ math runtime function-pointers dynamic-sizing

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

用户互动示例:

  • 输入16位模式
  • 输入5C
  • 按加号
  • 2A型
  • 按评估
    • return {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...
}

非常感谢有关攻击此问题的任何想法或建议。

3 个答案:

答案 0 :(得分:2)

您不能为函数设置“任意”返回值类型。如果你想返回一个不同大小的整数,有几种方法可以做到:一个联合,函数重载,一个模板(它会覆盖函数重载),或者一个(当我输入它时我感到畏缩){{1返回值。

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

void*

此结构的大小至少为72位(不包括填充和对齐问题),因此您可以轻松地返回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; } ,它将覆盖每个较小的整数大小。

答案 1 :(得分:2)

始终将值存储为最大数据类型。对你来说重要的是算术期间的截断。您可以通过传递全宽度值和位宽(模式)来实现。

答案 2 :(得分:1)

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