C++ 动态整数大小:int64\u t、int32\u t、uint32\u t等
我正在编写一个应用程序,允许用户选择整数存储的位大小并对其进行计算。他们可以选择8、16、32或64位存储作为有符号或无符号存储。这是在运行时设置和更改的,应用程序将使用给定的类型进行计算 用户交互示例: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方法不关心我使用的整数的大小,只要它们都
- 进入16位模式
- 5C型
- 新闻加号
- 2A型
- 新闻评估
- 返回{value1.getSigned16()+value2.getSigned16();}
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的补码运算,你只需要在除法之前截断;加法和乘法会自行处理…需要注意的是,您需要截断每个中间值,而不仅仅是最终结果,以获得与对较小类型进行运算相同的效果;加法和乘法会自动处理。。。