我正在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位。什么或如何进行计算?
答案 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
转换为其他类型