【发布时间】:2011-11-05 11:46:34
【问题描述】:
我遇到了一些人的代码,他似乎认为从另一个相同类型的整数中减去一个无符号整数会出现问题,而结果是负数。因此,即使它碰巧适用于大多数架构,这样的代码也是不正确的。
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
这是我能从 C 标准中找到的唯一模糊相关的引用。
涉及无符号操作数的计算永远不会溢出,因为 结果不能用得到的无符号整数表示 type 以比最大数大一的数为模减少 可以由结果类型表示的值。
我想人们可以把这句话理解为当右操作数更大时,该操作被调整为在模截断数字的上下文中有意义。
即
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
而不是使用依赖于实现的签名语义:
0x0000 - 0x0001 == (无符号)(0 + -1) == (0xFFFF 但也有 0xFFFE 或 0x8001)
哪种或哪种解释是正确的?有定义吗?
【问题讨论】:
-
标准中的单词选择是不幸的。它“永远不会溢出”意味着它不是错误情况。使用标准中的术语,而不是溢出值“wraps”。
标签: c standards unsigned integer-arithmetic