1

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

用户交互示例:

  • 进入 16 位模式
  • 5C型
  • 按加
  • 2A型
  • 按评估
    • 返回 { value1.getSigned16() + value2.getSigned16(); }

我想避免为每个操作员编写 8 个案例。我认为指针或函数指针可能适用于此。评估方法不关心我使用的整数大小,只要它们相同即可。问题是我不知道如何实现这一点,因为指针关心返回的变量类型。我考虑过使用通用指针,但是当我需要取消引用时这对我没有帮助,我仍然需要 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...
}

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

4

3 回答 3

2

函数不能有“任意”返回值类型。如果你想返回一个不同大小的整数,有几种方法可以做到:联合、函数重载、模板(将涵盖函数重载)或(我在键入时畏缩)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 位(不包括填充和对齐问题),因此您可以轻松地返回 an int64_t,它将涵盖每个较小的整数大小。

于 2014-01-31T19:54:46.047 回答
2

始终将值存储为最大的数据类型。对您来说重要的是算术期间的截断。您可以通过传递全角值加上位宽(模式)来做到这一点。

于 2014-01-31T21:09:36.120 回答
1

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

于 2014-01-31T21:13:22.487 回答