我遇到了某人的代码,该人似乎认为当结果为负数时,从另一个相同类型的整数中减去无符号整数是有问题的。这样的代码即使在大多数架构上都能正常工作,也是不正确的。
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
这是我能从C标准中找到的唯一含糊的相关报价。
涉及无符号操作数的计算永远不能溢出,因为无法用所得的无符号整数类型表示的结果的模数要比该所得的类型可以表示的最大值大一模。
我想可以用这个引号来表示,当右操作数较大时,该操作将被调整为在取模截数的上下文中有意义。
即
为0x0000 - 0x0001的== 0X 1 0000 - 0x0001的== 0xFFFF的
与使用依赖于实现的签名语义相反:
0x0000-0x0001 ==(无符号)(0 + -1)==(0xFFFF也是0xFFFE或0x8001)
哪种解释正确?完全定义了吗?