为什么使用int,unsinged int或size_t给出不同的结果?

时间:2018-10-04 15:14:05

标签: c++ visual-studio

我正在Windows 10 + VS2017(15.8.5)下开发

我的代码如下

#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的范围是(-2,147,483,648,2,147,483,647),index_int的运算会超出限制,因此负值与之相反unsigned int,范围为(0到4,294,967,295)。

无符号整数与size_t:但是,我不明白为什么size_t具有一个完全不同的值,我知道它的范围更大,因为它具有64位。什么或如何进行计算?

2 个答案:

答案 0 :(得分:3)

您的代码具有未定义的行为。在所有情况下,您都这样做

j * (res[0] + 1)

的结果为65224 * 65537,而4274585288依次为。该值超出了int大小的4可以容纳的值,因此您将获得带符号的整数溢出,这是未定义的行为。

答案 1 :(得分:-1)

您的代码没有不同(包括int溢出的UB)


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;

即结果来自将int转换为其他类型