我的代码中遇到了一个恼人的错误:
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)
答案 0 :(得分:1)
您有1个无符号和1个有符号变量作为二元运算符%
的操作数,在这种情况下,有符号变量将转换为无符号类型。 (您可以阅读这些转化规则的摘要here)
所以你的-1被转换为无符号值,这将是(假设int是32位)0xffffffff
0xffffffff % 60
为15