3

请考虑以下代码:

unsigned int var1 = 4294967295;

unsigned int var2 = 1000000;

unsigned int var3;

var3 = some_expression - (var1*var2)/some_expression;

漏洞:

在 var3 的表达式中,值:

(var1*var2) 被截断为 32 位整数(因为它是通过将 2 个 32 位整数相乘获得的)。

可能的修复:

var3 = some_expression - ((unsigned long int)var1*var2)/some_expression;

问题:

Solaris接受这种类型转换并引发以下错误:

“请求转换为非标量类型”

我可以在不进行类型转换的情况下解决此问题吗?

4

3 回答 3

1

引入一个中间变量:

unsigned int var1 = 4294967295U;
unsigned int var2 = 1000000U;
unsigned int var3;

{
  unsigned long int vartmp = var1;
  vartmp *= var;

  var3 = some_expression - vartmp/some_expression;
}
于 2012-11-10T10:31:35.553 回答
0

好吧,没有明确的类型转换,它可以完成为

unsigned long tmp = var1;
var3 = some_expression - (tmp * var2) / some_expression;

(假设unsigned long类型大于unsigned int)这与您的“可能修复”几乎相同。

但是,您的“可能的修复”应该自行工作。我不相信任何自尊的编译器会响应您的表达而生成这样的错误消息。发布产生此错误消息的真实代码。

事实上,我记得一两天前已经在这里问过一个非常相似的问题。在那种情况下,代码的作者将类型转换为某种类型定义的类型,例如UL64相信它代表unsigned long int,而实际上 typedef 指的是一种struct类型。这导致了错误消息。

于 2012-11-10T03:54:28.013 回答
0

必须有更好的方法,但我心中的数论家说要找到公因数,var1 var2some_expression试图取消我们的公因数。该解决方案的条件是他们共享一些甚至可能不会发生的因素。

我唯一能想到的另一件事是做某种模拟的long long大整数类型数学,这可能会变得混乱。

于 2012-11-10T03:52:04.420 回答