我正在开发一个混合 64 位(用于某些计算)和 32 位(用于节省空间的存储)无符号整数的程序,因此在算术过程中将它们分类以避免溢出非常重要
这是一个示例问题
我想将 1 向左移动一个 unsigned long n,但我希望结果是一个 unsigned long long。这将用于 if 语句中的比较操作,因此不会进行赋值。我给你一些代码。
void example(unsigned long shift, unsigned long long compare)
{
if((1<<shift)>compare)
{
do_stuff;
}
}
我怀疑这不会做我想要的,那么下面会做我想要的吗?
void example(unsigned long shift, unsigned long long compare)
{
if(((unsigned long long)1<<shift)>compare)
{
do_stuff;
}
}
我如何微观管理这些东西的位宽?哪个操作数决定了执行操作的位宽,还是两者中较大的一个?
另外,如果可能的话,我也想了解一下它对其他操作的工作原理,例如 + * / % 等。
也许引用具有此信息的资源会很好,我似乎无法在任何地方找到有关此信息的明确声明。或者也许规则很简单,只需发布即可。我不确定。