最佳答案
我曾经遇到过一个人,他似乎认为从另一个相同类型的整数中减去一个无符号整数是一个问题,而结果却是负数。因此,这样的代码是不正确的,即使它碰巧在大多数架构上工作。
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
这是我能找到的唯一与 C 标准相关的模糊引用。
涉及无符号操作数的计算永远不会溢出,因为 不能由结果无符号整数表示的结果 类型是减模的数目是一个比最大的 值,该值可以由结果类型表示。
我想人们可以把这个引号理解为,当正确的操作数更大时,在模截断数的上下文中,操作被调整为有意义的。
也就是说。
0x0000-0x0001 = = 0x10000-0x0001 = = = 0xFFFF
而不是使用依赖于实现的签名语义:
0x0000-0x0001 = = (未签名)(0 + -1) = = (0xFFFF 但也可以是0xFFFE 或0x8001)
Which or what interpretation is right? Is it defined at all?