我正在编写一个应用程序,允许用户选择整数存储的位大小并使用它进行数学运算。他们可以选择8,16,32或64位存储作为有符号或无符号存储。这是在运行时设置和更改的,应用程序将使用给定的类型进行数学运算。
用户互动示例:
我想避免为每个运营商编程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...
}
非常感谢有关攻击此问题的任何想法或建议。
答案 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位进行计算,然后将结果转换为位大小。