为什么余数运算符会因不同的数据类型而失败?

时间:2014-06-12 09:00:34

标签: c gcc

我的代码中遇到了一个恼人的错误:

length = 60;
index = -1;
rem = index % length;

在调试器中,我看到rem的值为15而不是-1,这对我没有任何意义。事实证明,length的类型为 unsigned int ,而index的类型为 int 。将length的类型更改为 int 可解决此问题。

然而,我不明白出了什么问题。鉴于余数运算的定义((a/b)*b + a%b == a),由于类型不同,我可能预期会出现符号错误,但我没想到15的随机值。(尽管60/4 = 15,所以也许有些比特被转移?)

我的问题是:为什么在使用带符号和无符号整数作为操作数时,余数操作会失败?哪些实施细节可能会导致这种情况?

(使用gcc 4.8.2)

1 个答案:

答案 0 :(得分:1)

您有1个无符号和1个有符号变量作为二元运算符%的操作数,在这种情况下,有符号变量将转换为无符号类型。 (您可以阅读这些转化规则的摘要here

所以你的-1被转换为无符号值,这将是(假设int是32位)0xffffffff 0xffffffff % 6015

相关问题