为什么我可以在 C++ 中将 65535+1 转换为有效的 int?

Why can I convert 65535+1 to a valid int in C++?

我有一个非常简单的程序:

int main()
{
  char* num = new char[5];
  sprintf(num, "65536");
  std::cout << "atoi(num): " << atoi(num) << "\n";
}

unsigned INT 的最大大小是 65535。为什么当我 运行 atoi(65536) 时这个程序不会溢出?

在当前的 PC 系统上,int 通常是 32 位甚至 64 位(除了一些较小的平台,例如 Arduino)。

因此,可能在您的系统上 int(或 unsigned int)大于 16 位,65536 不应溢出。您可以通过以下方式轻松检查:

std::cout << sizeof(int) << "\n";

此外,在 num 中没有 space 用于 null-terminator:

char* num = new char[5];
sprintf(num, "65536");

因此 sprintf() 将在您的缓冲区后写入终止 [=18=] 一个,导致 undefined behavior:

There is no way to limit the number of characters written, which means that code using sprintf is susceptible to buffer overruns.

这应该改为:

char* num = new char[6];