首页 > 解决方案 > 为什么使用 int、unsinged int 或 size_t 会产生不同的结果?

问题描述

我在 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 vs unsigned int:由于 an 的范围int是(-2,147,483,648, 2,147,483,647),因此操作会index_int溢出限制,因此是负值,unsigned int与其范围是(0 到 4,294,967,295)相反。

unsigned int vs size_t:但是,我不明白为什么size_t有一个完全不同的值,我知道它有一个更大的范围,因为它有 64 位。什么或如何进行计算?

标签: c++visual-studio

解决方案


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

j * (res[0] + 1)

which 评估为65224 * 65537which 又是4274585288。这个值超过了inta 大小4可以容纳的值,所以你得到有符号整数溢出,这是未定义的行为。


推荐阅读