代码之家  ›  专栏  ›  技术社区  ›  BRabbit27

为什么使用int、unsinged int或size\u t会产生不同的结果?

  •  0
  • BRabbit27  · 技术社区  · 6 年前

    我的代码如下

    #include <iostream>
    
    int main(int argc, char** argv)
    {
        int i = 65176;
        int j = 65224;
        int k = 0;
        int res[3] = {65536, 65536};
    
        int index_int = i + j * (res[0] + 1) + k * (res[0] + 1)*(res[1] + 1);
        unsigned int index_uint = i + j * (res[0] + 1) + k * (res[0] + 1)*(res[1] + 1);
        size_t index_sizet = i + j * (res[0] + 1) + k * (res[0] + 1)*(res[1] + 1);
    
        std::cout << "sizeof(int):          " << sizeof(index_int) << " - index_int   = " << index_int << std::endl;
        std::cout << "sizeof(unsigned int): " << sizeof(index_uint) << " - index_uint  = " << index_uint << std::endl;
        std::cout << "sizeof(size_t):       " << sizeof(index_sizet) << " - index_sizet = " << index_sizet << std::endl;
    
        return 0;
    }
    

    打印出来的

    sizeof(int):          4 - index_int   = -20316832
    sizeof(unsigned int): 4 - index_uint  = 4274650464
    sizeof(size_t):       8 - index_sizet = 18446744073689234784
    

    int与无符号int: 因为一个 int index_int 溢出限制,因此为负值,与 unsigned int

    无符号整数与大小\u t: size_t 有一个完全不同的值,我知道的是它有一个更大的范围,因为它有64位。计算是怎样进行的?

    2 回复  |  直到 6 年前
        1
  •  3
  •   R Sahu    6 年前

    您的代码具有未定义的行为。在任何情况下你都是这样

    j * (res[0] + 1)
    

    65224 * 65537 反过来也是 4274585288 . 这个值超过了 int 4

        2
  •  -1
  •   apple apple    6 年前

    您的代码与(包括 int 溢出)


    int index_int = i + j * (res[0] + 1) + k * (res[0] + 1)*(res[1] + 1);
    unsigned int index_uint = index_int;
    size_t index_sizet = index_int;
    

    到其他类型