C++似乎违反了加法的性质

C++ appears to violate properties of addition

本文关键字:C++      更新时间:2023-10-16

在为类赋值时,我遇到了这个(注意循环的条件)

// This one works.
for (int k = 0; k + negwords[j].length() < comments[i].length(); k++) {
    if (comments[i].substr(k, negwords[j].length()) == negwords[j]) {
        negativeScore++;
    }
}
//*/
/*/ This one doesn't: It fails with an out-of-bounds index.
for (int k = 0; k < comments[i].length() - negwords[j].length(); k++) {
    if (comments[i].substr(k, negwords[j].length()) == negwords[j]) {
        negativeScore++;
    }
}
//*/

为什么第一个有效,而第二个无效?它是关于操作顺序、对int的布尔强制、运算符关联性还是OBOE?

如果negwords[j].length()comments[i].length()返回的无符号整数类型至少与unsigned int一样大,则k将升级为相同的无符号类型,并且将应用模块加法规则

举个例子,这意味着1 < 2 - 3是真的,因为2 - 3在模运算中循环,成为一个非常大的数字。

如果您感兴趣,该行为在标准的3.9.1节中进行了规定,其中包括以下规则:

无符号整数应遵循算术模2n的定律,其中n是该特定大小整数的值表示中的位数。

还有一个关于含义的脚注:

48这意味着无符号算术不会溢出,因为无法由结果的无符号整数类型表示的结果被模减为比结果的无签名整数类型所能表示的最大值大一的数字。


数学家将这种类型的算术称为伽罗瓦域的代数。在C++中,它用于无符号积分类型。其他类型不使用模算术,但也不使用普通小学算术(形式上,实数代数),因为普通算术需要一个密集的不可数集,而有限大小的计算机不能表示无限集的成员

感谢奥利弗指出我的错误。GF(2)^n确实控制了计算机软件中的逐位运算和一大堆其他常见计算,如CRC。但它并没有描述超过1位的无符号算术,因为伽罗瓦域上的多项式不"进位"。

相关文章:
  • 没有找到相关文章