我在代码中遇到了一个烦人的错误:
length = 60;
index = -1;
rem = index % length;
在调试器中,我看到它的rem
值是15,而不是-1,这对我来说没有任何意义。原来,这length
是类型的无符号整型和index
是类型INT。将类型更改length
为int可以解决此问题。
但是,我不知道出了什么问题。给定余数运算((a/b)*b + a%b == a
)的定义,由于类型不同,我可能曾预计会出现符号错误,但我并未预期随机值15。(尽管60/4 = 15,所以也许有些位被移位了吗?)
我的问题是:为什么当以有符号和无符号整数作为操作数出现时,余数运算会失败?哪些实施细节可能导致此情况?
(使用gcc 4.8.2)
您有1个无符号变量和1个带符号变量作为二进制运算符的操作数%
,在这种情况下,带符号变量将转换为无符号类型。(您可以在此处阅读这些转换规则的摘要)
因此,您的-1将转换为无符号值,即(假设int为32位)0xffffffff
0xffffffff % 60
为15
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句