2

Possible Duplicate:
int divided by unsigned int causing rollover

Hi I am doing the following:

struct coord{
    int col;

};


int main(int argc, char* argv[]) {

    coord c;
    c.col = 0; 

    std::vector<coord> v;

    for(int i = 0; i < 5; i++){
        v.push_back(coord());
    }

    c.col += -13;


    cout << " c.col is " << c.col << endl;
    cout << " v size is " << v.size() << endl;

    c.col /= v.size();


    cout << c.col << endl;

}

and I get the following output:

 c.col is -13
 v size is 5
858993456

However, if I change the division line to c.col /= ((int)v.size()); I get the expected output:

 c.col is -13
 v size is 5
-2

Why is this?

4

4 回答 4

5

这是存在的v.size()结果unsigned

请参阅int 除以 unsigned int 导致翻转

于 2013-01-10T10:29:44.487 回答
4

问题是vector< ... >::size()返回size_t,这是typedef一个unigned整数类型。显然,当您将有符号整数与无符号整数相除时,就会出现问题。

于 2013-01-10T10:28:50.863 回答
2

std::vector::size 返回一个 size_t ,它是一个无符号整数类型,通常是unsigned int当您使用intunsigned int执行算术运算时,int操作数将转换为unsigned int以执行运算。在这种情况下,-13 被转换为unsigned int,这是一个接近 4294967295 的数字(十六进制的 FFFFFFFF)。然后除以 5。

于 2013-01-10T10:37:49.353 回答
1

如前所述,原因是通过首先将有符号值转换为无符号来执行有符号/无符号除法。

因此,您需要通过手动将无符号值转换为有符号类型来防止这种情况。

对于. v.size()_ int但是由于除数确实适合int,因此当除数大于除数时,除法的结果相当无聊。所以假设 2 的补码并且没有填充位:

if (v.size() <= INT_MAX) {
    c.col /= int(v.size());
} else if (c.col == INT_MIN && v.size() - 1 == INT_MAX) {
    c.col = -1;
} else {
    c.col = (-1 / 2);
}

在 C++03 中,负值除以较大的正值是 0 还是 -1 是实现定义的,因此很有趣(-1 / 2)。在 C++11 中,你可以只使用 0。

要涵盖除 2 的补码以外的其他表示,您需要以不同的方式处理特殊情况。

于 2013-01-10T11:34:11.620 回答