为什么我可以在 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];
我有一个非常简单的程序:
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];